2016-12-03 65 views
0

我有一個構造函數的向量作爲參數和一些成員函數,關於矢量操作的類:C++輸入運算符重載類和矢量

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 } 
}; 

我重載輸入操作者採取一個向量的特定格式的值: 「:1 2 3 4 5> < 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; 
} 

我去測試我的代碼:

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); 
} 

我運行代碼輸入格式爲「< 5:1 2 3 4 5>」的值,而是獲得的最小和最大值打印出所有我得到的是:

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

如果我更改操作while循環重載:

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

我得到的最小值和最大值,當我在主測試的代碼,但只能獲得一半的輸入:

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

我知道這是爲什麼:item = 1,rpar = 2,rpar不等於'>',myvec.pushback(1)等等......

所以我認爲錯誤可能與雖然循環,但我不知道我要去哪裏錯了。

編輯:

所以我包括一個計數輸入數量比較大小:

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

我現在得到:

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

的最後一個值不被包括在內。

回答

1

超載的>>運算符在同一行中有兩個錯誤。

while(s >> item && rpar != '>'){ 
  1. rpar它的價值在這裏比較之前未初始化。這是未定義的行爲。

  2. 這種未定義行爲的可能結果是rpar將會是一些垃圾,並且只有256個機率中有1個是'>'字符。否則,這個比較永遠是正確的,這while循環邏輯上等同於:

    while (s >> item) 
    

這意味着該while循環將繼續,直到輸入流運行或者進入故障狀態,或直至它到達文件的末尾。

這意味着當您的>>運算符重載返回時,該流保證處於錯誤或失敗狀態。這意味着,在您的主要功能:

while (cin >> mc) 

將永遠是真實的,這就是爲什麼你沒有得到你的最小和最大顯示值。

您需要:

  1. 絕對固定未定義的行爲。

  2. 可能修復您的>>運營商的邏輯。

0

好吧,我想我可能已經固定我的問題,我改變了邏輯,所以我現在用的是for循環,我可以仍然使用while循環,但我覺得一個for循環更好:

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

希望這是正確的。