如何正确设置istream&运营商GT;>对于数组项?

时间:2016-11-19 14:01:48

标签: c++ operator-overloading

所以我有一个动态制作的队列,我试图重载>>操作员。但我输入的数字是错误的。我猜错了什么? (<<运算符可以正常工作)。 所以我的课程是:

class queue
{
     int queue1[100];
     int rear1,front1, num1;
public:
    queue(): rear1(-1),front1(-1){};
    queue(int , int , int);

    void insert1(int );
    void delet1();

    friend istream& operator>>(istream& in, queue& obj);

    friend ostream& operator<<(ostream& out, const queue& obj);
    void queue::printOn(ostream &out) const;

};

和函数运算符本身:

istream& operator>>(istream& in, queue& obj){
    in >> obj.queue1[obj.rear1++];
    cout <<"inserted: " << obj.queue1[obj.rear1];
    return(in);
}

我的主要功能是:

queue qu1;
cout<<"Entered number:";
cin>>qu1;
cout << qu1;

这是程序的工作方式:

  

输入的数字:5

  

已插入:-858993460

     

已插入:-858993460

2 个答案:

答案 0 :(得分:0)

未定义的行为:

in >> obj.queue1[obj.rear1++];
cout <<"inserted: " << obj.queue1[obj.rear1];  << rear1 is 1 more than above

答案 1 :(得分:0)

obj.rear1++将返回当前的real1

所以在第一时间使用

in >> obj.queue1[obj.rear1++];变为in >> obj.queue1[-1];

这是未定义的行为。

cout <<"inserted: " << obj.queue1[obj.rear1];变为cout <<"inserted: " << obj.queue1[0];

这是从未初始化的内存中读取的,也是未定义的行为。

obj.rear1++更改为++obj.rear1可以解决这两个问题。