1

単純な istream 演算子のオーバーロードを実行しようとしていますが、何らかの理由で、この関数に入るとプログラムが無限ループに入ります。助けてください!

私のコード:

#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();
}
4

2 に答える 2

7

constオブジェクト (d)を変更しようとしているので、このコードは私には間違っているようです。

istream& operator>> (istream& stream, const date& d){              //overload >>
    stream >> d.m_day;
    return stream;    
}
于 2013-05-17T13:45:27.533 に答える
2

実際、マークの答えはあなたの問題を完全には解決しません。何が起こっているかはもう少し複雑です:

を受け取る関数を定義しましたconst &。これにより、コンパイラは単に関数のコンパイルを拒否するはずでした。しかし、ここに問題があります。コンストラクターにdateは、すべてのパラメーターのデフォルト値があります。したがって、1 つのパラメーターのみで呼び出すことができます。マークされていないexplicitため、int の暗黙的な変換演算子として機能します ( などdate(i))。これは、コンパイラがstream >> d.m_dayとして解釈できることを意味しstream >> date(d.m_day)ます。したがって、あなたの問題は次のとおりです。これは呼び出しでoperator>>(istream& stream, const date& d)あり、無限再帰が発生します。

date& dしたがって、のオーバーロードを非 const にするだけでなく、コンストラクターにoperator>>もマークを付ける必要があります。explicit

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

暗黙的な変換演算子として機能しないようにします。これは、実際には、パラメーターを 1 つだけ取る可能性のあるほぼすべてのコンストラクターに対して行う必要があります。

于 2015-09-28T18:56:00.337 に答える