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

Почему вы вызываете «правильно» в (уже очень длинном) вопросе? Что это добавляет? –

+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