2016-11-19 38 views
0

所以我有一个动态的队列,我试图为它重载>>运算符。但我输入的号码是错误的。任何猜测我做错了什么? (< <运营商工作得很好,但)。 所以我的课是:如何正确设置数组项目的istream&operator >>?

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

和我的主要funtion是:

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

这档节目是如何工作的:

已输入号码:5

插入:-858993460

插入:-858993460

+2

由于您已完成'rear1 ++',因此您正在最后一个元素之后打印对象。你应该使用'cout <<“插入:”<< obj.queue1 [obj.rear1-1];' – Franck

+0

10为什么你在(已经很长的)问题标题中喊出“正确”?这是什么添加? –

+0

是的,这有帮助,它打印出我输入的号码。但是,当我尝试打印队列如下: 'cout << qu1;' 它仍然打印出-858993460号码。 – yTpo

回答

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可以解决这两个问题。

0

这是未定义的行为:

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