2013-05-17 2 views
0

Я пытаюсь выполнить перегрузку оператора istream, но по какой-то причине после ввода этой функции программа вводит бесконечный цикл. , пожалуйста, помогите!Перегрузка оператора istream C++

мой код:

#include <iostream> 
#include <string> 
using namespace std; 

class date{ 

int m_day,m_month,m_year; 

public: 

date(int day=1,int month=1,int year=2000){ //constructor 
    if (day>0 && day<32 && month>0 && month<13){ 
     m_day =day; 
     m_month=month; 
     m_year=year; 
    } 
} 


friend ostream& operator<< (ostream& out, const date& d); 
friend istream& operator>> (istream& in, const date& d); 
}; 


istream& operator>> (istream& stream, const date& d){    //overload >> 
stream >> d.m_day; 
return stream; 

} 

void main(){ 

date date1; 

cin>>date1;     //check istream 

getchar(); 
} 
+6

Забавно, поскольку в вашем коде нет петель. –

+1

Какой цикл вы говорите? Вы пытались отлаживать, пытались ли вы трассировать, чтобы увидеть/понять, что происходит? –

ответ

6

Этот код кажется мне неправильным, так как вы пытаетесь изменить const объекта (г).

istream& operator>> (istream& stream, const date& d){    //overload >> 
    stream >> d.m_day; 
    return stream;  
} 
+0

спасибо, что была проблема! – user1887990

+0

А, отлично! Рад был помочь. –

+0

, когда я сказал, что это означает, что он шел туда и обратно между линией: stream >> d.m_day; и строка: istream & operator >> (istream & stream, const date & d) { – user1887990

0

На самом деле ответ Marc не решит вашу проблему полностью. Что происходит немного сложнее:

Вы определили функцию, получающую const &. Это должно заставить компилятор просто отказаться от компиляции вашей функции. Но здесь кроется проблема: ваш конструктор для date имеет значения по умолчанию для каждого параметра. Поэтому его можно вызвать только с одним параметром. Так как он не помечен explicit, он работает как оператор неявного преобразования для int (например, date(i)). Это означает, что компилятор может интерпретировать stream >> d.m_day как stream >> date(d.m_day). Таким образом, ваша проблема: это вызов для operator>>(istream& stream, const date& d), и вы получаете бесконечную рекурсию.

Таким образом, вы должны не только сделать date& d неконстантные на вашей перегрузке operator>>, следует также отметить конструктор explicit, как

explicit date(int day=1, int month=1, int year=2000) 

так, что она не действует как оператор преобразования неявного. Это должно быть сделано практически для каждого конструктора, который может принимать только один параметр.