2016-12-03 2 views
0

Ich habe eine Klasse mit einem Konstruktor, der einen Vektor als Argument und einige Mitgliedsfunktionen, die auf dem Vektor arbeiten nimmt:C++ Eingabeoperator für die Klasse und Vektor-Überlastung

class myclass{ 
vector<double> myvec; 
public: 
    myclass(){ cout << "Constructor 1 " << endl; } 

    myclass(const vector <double> &v){ "Constructor 2 " << endl; } 

    ostream& print(ostream &s) const { //print function used in overloading output operator } 

    double minimum(){ //return min value of vector } 

    double maximum(){ //return max value of vector } 
}; 

I den Eingangsoperator überlastete zu ergreifen die Werte eines Vektors in einem bestimmten Format: "< 5: 1 2 3 4 5>":

istream& operator>>(istream &s, myclass &mc) { 
int size; 
double item; 
vector<double> tempvec; 
char lpar, colon, rpar; 
if (s >> lpar) { 
    if ((s >> size >> colon) && (lpar == '<' && colon == ':')){ 
     tempvec[size]; 
     while(s >> item && rpar != '>'){ 
      tempvec.push_back(item); 
     } 
     mc = myclass(tempvec); 
     s >> rpar; 
    }else{ 
     s.setstate(ios::badbit); 
    } 
} 
return s; 
} 

ich gehe meinen Code zu testen:

int main(){ 
myclass mc; 
cout << "Main Start" << endl; 
while (cin >> mc) 
    cout << mc << endl << mc.minimum() << endl << mc.maximum() << endl; 
if (cin.bad()) cerr << "\nBad input\n\n"; 
cout << "Main Start" << endl; 
return (0); 
} 

Ich betreibe die Werte im Format, um die Code-Eingabe „< 5: 1 2 3 4 5>“, sondern die minimalen und maximalen Wert des Erhaltens ausgedruckt alles, was ich bekommen ist:

Constructor 1 
Main Start 
<5: 1 2 3 4 5> 
Constructor 2 
Main End 

Wenn ich ändern Sie die while-Schleife in den Bediener Überlastung an:

while(s >> item >> rpar && rpar != '>'){ 
      tempvec.push_back(item); 
     } 
     mc = myclass(myvec); 

ich erhalte die min und max, wenn ich den Code in Haupt testen, aber nur bekommen die Hälfte der Eingänge:

Constructor 1 
Main Start 
<5: 1 2 3 4 5> 
Constructor 2 
<2: 1 3> 
1 
3 

Ich verstehe, warum dies ist: item = 1, rpar = 2, rpar ist nicht gleich '>', myvec.pushback (1) und so weiter ...

Also ich denke, der Fehler könnte mit dem zu tun haben While-Schleife, aber ich bin mir nicht sicher, wo ich falsch liege.

Edit:

So enthalten ich eine Zählung die Anzahl der Eingänge zu der Größe zu vergleichen:

while(s >> item && count < size && rpar != '>'){ 
     tempvec.push_back(item); 
     ++count; // count++ doesnt change anything 
    } 
    mc = myclass(tempvec); 
    s >> rpar; 

ich jetzt:

Constructor 1 
Main Start 
<5: 1 2 3 4 5> 
Constructor 2 
<4: 1 2 3 4> 
1 
4 
Main End 

Der letzte Wert ist nicht enthalten sein.

Antwort

1

Es gibt zwei Fehler in derselben Zeile in Ihrem überladenen >>-Operator.

while(s >> item && rpar != '>'){ 
  1. rpar wird nicht initialisiert, bevor ihr Wert hier verglichen wird. Dies ist ein nicht definiertes Verhalten.

  2. Das wahrscheinliche Ergebnis dieses undefinierten Verhaltens ist, dass rpar wird einige Müll sein, und es gibt nur 1 in 256 Chance, dass es das Zeichen> sein wird. Ansonsten wird dieser Vergleich immer wahr sein, und diese while Schleife ist logisch äquivalent zu:

    while (s >> item) 
    

Dies bedeutet, dass diese while Schleife, bis der Eingangsstrom wird auch weiterhin laufen entweder geht in gescheiterter Staat, oder bis es erreicht das Ende der Datei.

Dies bedeutet, dass bei Überlauf des Operators >> der Stream einen Fehler oder einen Fehlerzustand aufweist.Dies bedeutet, dass in der Hauptfunktion:

while (cin >> mc) 

wird nie wahr sein, und das ist, warum Sie gezeigt werden, sind nicht die Mindest erhalten und Maximalwerte.

Sie müssen:

  1. Definitiv das nicht definiertes Verhalten beheben.

  2. Wahrscheinlich beheben Sie die Logik in Ihrem >>-Operator.

0

Ok ich glaube, ich mag mein Problem behoben ich die Logik geändert und so bin ich jetzt eine for-Schleife, konnte ich habe noch eine while-Schleife verwendet, aber ich denke, eine for-Schleife ist besser :

for (int i = 1; i <= size; ++i){ 
      s >> item; 
      tempvec.push_back(item); 
     } 
     if (s >> rpar && rpar == '>'){ 
      mc = myclass(tempvec); 
     } 

Hoffentlich ist das korrekt.

Verwandte Themen