上記のコードが無限ループを生成する理由を説明できますか?オーバーロード時にスタックオーバーフローが発生する<<演算子
答えて
あなたは、それはすべきではないどこconst
を持っているので:
///// /////
const ostream& operator<<(const ostream& o, const aClass &a)
出力ストリームは、非constすると仮定されます。結局のところ、出力データは何かを変えています。だから、これを行うとき:その1は非constストリーム上で動作するため、それは、char*
のための通常のオーバーロードを使用することはできません
o << a.message;
。代わりに、適切なオーバーロードを検索して自分のものを見つけ、aClass
をa.message
(コンストラクタがexplicit
ではないため)から構築し、それを呼び出すことができると判断します。これは永遠に繰り返されます。
としてそれを記述する必要があります:なぜちょうど `のstd :: STRING`を使用しないで
ostream& operator<<(ostream& o, const aClass &a)
{
o << a.message;
return o;
}
あなたがそれにいる間、コンストラクタを '明示的に'にします。あるいはもっと良いのは、単に 'std :: string' **を使うだけです! –
これとは別に、Classは壊れやすい(プライベートコピーコンストラクタと代入演算子を持たず)非効率的である(strlenの結果はローカルに格納し、strcpyの代わりにmemcpyを使用するべきである)。 – Achille
? –
[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