2016-11-19 80 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