【问题标题】:C++ input operator overloading for class and vector类和向量的 C++ 输入运算符重载
【发布时间】:2016-12-03 01:24:54
【问题描述】:

我有一个带有构造函数的类,该构造函数将向量作为参数以及一些对向量进行操作的成员函数:

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

我已经重载了输入运算符,以获取特定格式的向量值:“”:

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

我运行代码以“”格式输入值,但我得到的不是打印出最小值和最大值:

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

当我在 main 中测试代码时,我得到了最小值和最大值,但只得到了一半的输入:

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 循环有关,但我不确定我哪里出错了。

编辑:

所以我加入了一个计数来比较输入的数量和大小:

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

最后一个值不包括在内。

【问题讨论】:

    标签: c++ vector input operator-overloading


    【解决方案1】:

    在您重载的&gt;&gt; 运算符的同一行中有两个错误。

        while(s >> item && rpar != '>'){
    
    1. rpar 在此处比较其值之前未初始化。这是未定义的行为。

    2. 这种未定义行为的可能结果是rpar 将是一些垃圾,并且只有 256 分之一的机会是“>”字符。否则这个比较总是正确的,这个while循环在逻辑上等价于:

      while (s >> item)
      

    这意味着这个while 循环将继续运行,直到输入流进入失败状态,或者直到它到达文件末尾。

    这意味着当您的&gt;&gt; 运算符重载返回时,流肯定会处于错误或失败状态。这意味着在您的主要功能中:

    while (cin >> mc)
    

    永远不会是真的,这就是为什么你没有显示你的最小值和最大值。

    你需要:

    1. 绝对修复未定义的行为。

    2. 可能会修复 &gt;&gt; 运算符中的逻辑。

    【讨论】:

      【解决方案2】:

      好的,我想我可能已经解决了我的问题,我改变了逻辑,所以我现在使用 for 循环,我仍然可以使用 while 循环,但我认为 for 循环更好:

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

      希望这是正确的。

      【讨论】:

        猜你喜欢
        • 2021-09-08
        • 2013-11-10
        • 2013-12-15
        • 2012-12-30
        • 2013-05-15
        • 2020-03-09
        • 1970-01-01
        • 1970-01-01
        • 2022-07-21
        相关资源
        最近更新 更多