2017-04-30 2 views
-2

Ich muss die < < und >> Operatoren überladen, aber ich sehe keine Fehler. Wenn ich nur Operator < < überladen und das Objekt in Main direkt initialisieren. Ich erhalte keinen Fehler. Aber wenn ich Operator >> überladen habe, sehe ich kein Popup, um die Variablen für das Objekt einzugeben. Hier ist der Code und ich scheine nicht zu finden, was mit ihm los istOperator überladen >> cin

#include <iostream> 
#include <string.h> 
#include <assert.h> 
using namespace std; 
class vehicle 
{ 
protected: 
    int number, year, cost; 
    char *make, *model, *bodyStyle, *color; 
public: 
    vehicle(int = 0, int = 0, char* = NULL, char* = NULL, char* = NULL, char* = NULL, int = 0); 
    ~vehicle(); 
    friend istream &operator>>(istream& stream, vehicle& v); 
    friend ostream &operator<<(ostream& stream, const vehicle& v); 
}; 
vehicle::vehicle(int a, int b, char* ma1, char* mod1, char* bs1, char* c1, int cos) 
{ 
    number = a; 
    year = b; 

    make = new char[strlen(ma1) + 1]; 
    assert(make); 
    strcpy (make,ma1); 

    model = new char[strlen(mod1) + 1]; 
    assert(model); 
    strcpy(model,mod1); 

    bodyStyle = new char[strlen(bs1) + 1]; 
    assert(bodyStyle); 
    strcpy(bodyStyle,bs1); 

    color = new char[strlen(c1) + 1]; 
    assert(color); 
    strcpy(color,c1); 

    cost = cos ; 
} 
vehicle::~vehicle() 
{ 
    delete[] make; 
    delete[] model; 
    delete[] bodyStyle; 
    delete[] color; 
} 
istream& operator>>(istream& stream, vehicle& v) 
{ 
    stream>>v.number; 
    stream>>v.year; 
    stream>>v.cost; 
    stream>>v.make; 
    stream>>v.model; 
    stream>>v.bodyStyle; 
    stream>>v.color; 
    return stream; 
} 
ostream& operator<<(ostream& stream, const vehicle& v) 
{ 
    stream<<v.number<<endl; 
    stream<<v.year<<endl; 
    stream<<v.cost<<endl; 
    stream<<v.make<<endl; 
    stream<<v.model<<endl; 
    stream<<v.bodyStyle<<endl; 
    stream<<v.color<<endl; 
    return stream; 
} 

class Truckvehicle : public vehicle 
{ 
    int passengers, mileage, grossWeight, tempGross; 
    char *poweredBy; 
    public: 
    Truckvehicle(int = 0, int = 0, char* = NULL, char* = NULL, char* = NULL, char* = NULL, int = 0, int = 0, int = 0, int = 0, char * = NULL, int = 0); 
    ~Truckvehicle(); 
    friend ostream & operator<<(ostream& stream, const Truckvehicle& tv); 
    friend istream & operator>>(istream& stream, Truckvehicle& tv); 

}; 

Truckvehicle::Truckvehicle(int a, int b, char* ma1, char* mod1, char* bs1, char* c1, int cos, int pass1, int mil, int gross, char* pb, int tg) : 
    vehicle(a, b, ma1, mod1, bs1, c1, cos), passengers(pass1), mileage(mil), grossWeight(gross), poweredBy(pb), tempGross(tg) 
{ 
    passengers = pass1; 
    mileage = mil; 
    grossWeight = gross; 

    poweredBy = new char[strlen(pb) + 1]; 
    assert(poweredBy); 
    strcpy(poweredBy, pb); 

    tempGross = tg; 
} 

Truckvehicle :: ~Truckvehicle() 
{ 
    delete[] poweredBy; 
} 
istream& operator>>(istream& stream, Truckvehicle& tv) 
{ 
    stream>>tv.number; 
    stream>>tv.year; 
    stream>>tv.make; 
    stream>>tv.model; 
    stream>>tv.bodyStyle; 
    stream>>tv.color; 
    stream>>tv.cost; 
    stream>>tv.passengers; 
    stream>>tv.mileage; 
    stream>>tv.grossWeight; 
    stream>>tv.poweredBy; 
    stream>>tv.tempGross; 

    return stream; 
} 
ostream & operator<<(ostream& stream, const Truckvehicle& tv) 
{ 
    stream<<tv.number<<endl; 
    stream<<tv.year<<endl; 
    stream<<tv.make<<endl; 
    stream<<tv.model<<endl; 
    stream<<tv.bodyStyle<<endl; 
    stream<<tv.color<<endl; 
    stream<<tv.cost<<endl; 
    stream<<tv.passengers<<endl; 
    stream<<tv.mileage<<endl; 
    stream<<tv.grossWeight<<endl; 
    stream<<tv.poweredBy<<endl; 
    stream<<tv.tempGross<<endl; 

    return stream; 
} 
int main() 
{ 
Truckvehicle TV; 
//Read in the following values for TV (111111, 2014,"Toyota","Tacoma", "4X4", "Black",25000, 2, 15000,333333,"Gas", 222222); 
cin>>TV; 
cout<<TV; 
return 0; 
} 
+0

"Pop-up"? Wenn Sie 'std :: cin' verwenden, geben Sie einfach in die Konsole ein. – aschepler

+0

es gibt mir nur .cpp gestoppt, um Fehler zu arbeiten – mwater07

+2

Um Gottes willen, verwenden Sie std :: string. –

Antwort

0

Hallo dort können Sie diesen Code untersuchen, die in Wandbox mit GCC HEAD 8 Compiler ohne Fehler und Warnungen kompiliert. Ich werde alle Fragen zu meinem Code rechtzeitig beantworten.

Grüße, Micha

#include <iostream> 

// Don't use <blah.h>, prefer using <cblah>. 
#include <cstring> 
#include <cassert> 

// extra includes. 
#include <string> 
#include <sstream> 

using namespace std; 

class vehicle 
{ 
    friend ostream& operator<< (ostream& stream, vehicle const& v); 
    friend istream& operator>> (istream& stream, vehicle& v); 

protected: 
    int number, year, cost; 
    char *make, *model, *bodyStyle, *color; 

public: 
    vehicle(int = 0, 
      int = 0, 
      char const* = "-", // Don't choose NULL here - prevents segmentation fault in main! 
      char const* = "-", 
      char const* = "-", 
      char const* = "-", 
      int = 0); 

    ~vehicle(); 
}; 

vehicle::vehicle(int a, 
       int b, 
       char const* ma1, 
       char const* mod1, 
       char const* bs1, 
       char const* c1, 
       int cos) 
{ 
    number = a; 
    year = b; 

    make = new char[strlen(ma1) + 1]; 
    assert(make); 
    strcpy(make, ma1); 

    model = new char[strlen(mod1) + 1]; 
    assert(model); 
    strcpy(model, mod1); 

    bodyStyle = new char[strlen(bs1) + 1]; 
    assert(bodyStyle); 
    strcpy(bodyStyle, bs1); 

    color = new char[strlen(c1) + 1]; 
    assert(color); 
    strcpy(color, c1); 

    cost = cos; 
} 

vehicle::~vehicle() 
{ 
    if (make)  delete[] make; 
    if (model)  delete[] model; 
    if (bodyStyle) delete[] bodyStyle; 
    if (color)  delete[] color; 
} 

ostream& operator<< (ostream& stream, vehicle const& v) 
{ 
    stream << v.number << endl; 
    stream << v.year  << endl; 
    stream << v.cost  << endl; 
    stream << v.make  << endl; 
    stream << v.model  << endl; 
    stream << v.bodyStyle << endl; 
    stream << v.color  << endl; 

    return stream; 
} 

istream& operator>> (istream& stream, vehicle& v) 
{ 
    stream >> v.number; 
    stream >> v.year; 
    stream >> v.cost; 
    stream >> v.make; 
    stream >> v.model; 
    stream >> v.bodyStyle; 
    stream >> v.color; 

    return stream; 
} 



class Truckvehicle : public vehicle 
{ 
    friend ostream& operator<< (ostream& stream, Truckvehicle const& tv); 
    friend istream& operator>> (istream& stream, Truckvehicle& tv); 

    int passengers, mileage, grossWeight, tempGross; 
    char *poweredBy; 

public: 
    Truckvehicle(int = 0, 
       int = 0, 
       char const* = "-", 
       char const* = "-", 
       char const* = "-", 
       char const* = "-", 
       int = 0, 
       int = 0, 
       int = 0, 
       int = 0, 
       char const* = "-", 
       int = 0); 

    ~Truckvehicle(); 
}; 

Truckvehicle::Truckvehicle(int a, 
          int b, 
          char const* ma1, 
          char const* mod1, 
          char const* bs1, 
          char const* c1, 
          int cos, 
          int pass1, 
          int mil, 
          int gross, 
          char const* pb, 
          int tg) 
    : 
    vehicle(a, b, ma1, mod1, bs1, c1, cos) 
{ 
    passengers = pass1; 
    mileage  = mil; 
    grossWeight = gross; 

    poweredBy = new char[strlen(pb) + 1]; 
    assert(poweredBy); 
    strcpy(poweredBy, pb); 

    tempGross = tg; 
} 

Truckvehicle::~Truckvehicle() 
{ 
    delete[] poweredBy; 
} 

ostream& operator<< (ostream& stream, Truckvehicle const& tv) 
{ 
    // vehicle part. 
    stream <<tv.number  <<endl; 
    stream <<tv.year  <<endl; 
    stream <<tv.make  <<endl; 
    stream <<tv.model  <<endl; 
    stream <<tv.bodyStyle <<endl; 
    stream <<tv.color  <<endl; 
    stream <<tv.cost  <<endl; 

    // extra truck part. 
    stream <<tv.passengers <<endl; 
    stream <<tv.mileage  <<endl; 
    stream <<tv.grossWeight <<endl; 
    stream <<tv.poweredBy <<endl; 
    stream <<tv.tempGross <<endl; 

    return stream; 
} 

istream& operator>> (istream& stream, Truckvehicle& tv) 
{ 
    // vehicle part. 
    stream >>tv.number; 
    stream >>tv.year; 
    stream >>tv.make; 
    stream >>tv.model; 
    stream >>tv.bodyStyle; 
    stream >>tv.color; 
    stream >>tv.cost; 

    // extra truck part. 
    stream >>tv.passengers; 
    stream >>tv.mileage; 
    stream >>tv.grossWeight; 
    stream >>tv.poweredBy; 
    stream >>tv.tempGross; 

    return stream; 
} 


// Simulates usage of std::operator>>(). 
void initializeTruckvehicle(Truckvehicle& TV, 
          int a, 
          int b, 
          char const* ma1, 
          char const* mod1, 
          char const* bs1, 
          char const* c1, 
          int cos, 
          int pass1, 
          int mil, 
          int gross, 
          char const* pb, 
          int tg) 
{ 
    string s; 

    s += static_cast <ostringstream *> (&(ostringstream() << a)) -> str(); 
    s += " "; 

    s += static_cast <ostringstream *> (&(ostringstream() << b)) -> str(); 
    s += " "; 

    s += ma1; 
    s += " "; 

    s += mod1; 
    s += " "; 

    s += bs1; 
    s += " "; 

    s += c1; 
    s += " "; 

    s += static_cast <ostringstream *> (&(ostringstream() << cos )) -> str(); 
    s += " "; 

    s += static_cast <ostringstream *> (&(ostringstream() << pass1)) -> str(); 
    s += " "; 

    s += static_cast <ostringstream *> (&(ostringstream() << mil )) -> str(); 
    s += " "; 

    s += static_cast <ostringstream *> (&(ostringstream() << gross)) -> str(); 
    s += " "; 

    s += pb; 
    s += " "; 

    s += static_cast <ostringstream *> (&(ostringstream() << tg )) -> str(); 
    s += " "; 

    istringstream in(s); 
    in >> TV; 
} 



int main() 
{ 
    cout << "Truck 1>" << endl; 

    Truckvehicle TV1 (111111, 
         2014, 
         "Toyota", 
         "Tacoma", 
         "4X4", 
         "Black", 
         25000, 
         2, 
         15000, 
         333333, 
         "Gas", 
         222222); 
    cout << TV1; 


    cout << "Truck 2>" << endl; 

    Truckvehicle TV2; 
    cout << TV2; 


    cout << "Truck 3>" << endl; 

    Truckvehicle TV3; 
    initializeTruckvehicle (TV3, 
          111111, 
          2014, 
          "Toyota", 
          "Tacoma", 
          "4X4", 
          "Black", 
          25000, 
          2, 
          15000, 
          333333, 
          "Gas", 
          222222); 
    cout << TV3; 
} 
+0

Leider werden Ihre 'operator >>' Funktionen versuchen, die 'char *' Argumente unabhängig von ihrer aktuellen Größe zu schreiben, was wahrscheinlich schlechte Nachrichten sind. Deshalb haben wir 'std :: string'. – aschepler