2011-01-08 12 views
2

上記のコードが無限ループを生成する理由を説明できますか?オーバーロード時にスタックオーバーフローが発生する<<演算子

+1

? –

+0

[3つのルール](http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29)を破っていることにご注意ください。あなたのクラスをコピーしたら、ブームを起こしてください。コピーコンストラクタと代入演算子も必要ですが、[copy-and-swap idiom](http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom)を使用してください。実際には 'std :: vector 'や 'std :: string'を使うべきであることに注意してください。 – GManNickG

答えて

11

あなたは、それはすべきではないどこconstを持っているので:

/////      ///// 
const ostream& operator<<(const ostream& o, const aClass &a) 

出力ストリームは、非constすると仮定されます。結局のところ、出力データは何かを変えています。だから、これを行うとき:その1は非constストリーム上で動作するため、それは、char*のための通常のオーバーロードを使用することはできません

o << a.message; 

。代わりに、適切なオーバーロードを検索して自分のものを見つけ、aClassa.message(コンストラクタがexplicitではないため)から構築し、それを呼び出すことができると判断します。これは永遠に繰り返されます。

としてそれを記述する必要があります:なぜちょうど `のstd :: STRING`を使用しないで

ostream& operator<<(ostream& o, const aClass &a) 
{ 
    o << a.message; 
    return o; 
} 
+1

あなたがそれにいる間、コンストラクタを '明示的に'にします。あるいはもっと良いのは、単に 'std :: string' **を使うだけです! –

+0

これとは別に、Classは壊れやすい(プライベートコピーコンストラクタと代入演算子を持たず)非効率的である(strlenの結果はローカルに格納し、strcpyの代わりにmemcpyを使用するべきである)。 – Achille

関連する問題