• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:std::wstringの継承)

std::wstringの継承による文字列代入処理の実装方法

このQ&Aのポイント
  • VisualC++2008ExpressEditionで文字や数字を簡単に扱えるクラスを作成しようとしています。
  • クラスmultiStringは、std::wstringを継承しています。
  • しかし、wchar_tをクラスに代入する処理の実装でエラーや例外が発生しています。継承した場合はどのように実装すればいいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

正確なエラーメッセージは 「すべてのコントロールのパス, 関数を回帰するとランタイムスタックオーバーフローが発生します」 というもの. ここの this は multiString * です. そして operator = は継承されないので, コンストラクタ中の *this = s; における operator = は wstring::operator = ではなく multiString::operator = です. しかも今の場合このメンバー関数を定義していないので, コンパイラが自動生成した multiString &multiString::operator =(const multiString &) を使います. ところが, 代入の右辺は const wchar_t * ですからこの代入演算子にあわせるためにコンストラクタ multiString::multiString(const wchar_t *) を呼び出そうとします. これで無限再帰が成立. 明示的に std::wstring::operator = を呼び出せばいいんだけどね....

glarelance
質問者

お礼

なるほど、確かに、 multiString(const wchar_t *cs){std::wstring::operator =(cs);} という風に、コンストラクタを書いておくとうまくいきました。 どうも有り難うございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

え~と.... #1 の言われるように multiString(const wchar_t *s) : std::wstring(s) {} でいいのでは? しかし Visual C++ も賢いなぁ. 確かに multiString(const wchar_t *s){*this=s;} だとスタックオーバーフローするよ.... コンパイラのいう通りだ....

glarelance
質問者

お礼

確かに、「multiString(const wchar_t *s) : std::wstring(s) {}」と書くと代入できますが、「multiString(const wchar_t *s){*this=s;}」と書いてあっても、wstringにはwchar_tを「operator=」で代入できると思うのですが、このようにすると何故、スタックオーバーフローとなってしまうのでしょうか?

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

結局のところ, どのようなプログラムを書いたのですか? できる限り省略しないで全体を出してください.

glarelance
質問者

お礼

解答有り難うございます。 実際私が書いたプログラムとしては、テストのためQ1の人へのお礼で書いたように、最初に示したソースの「/* multiString class自体に代入 */」の部分に、 multiString(const wchar_t *s){std::wstring(s);} とか multiString(const wchar_t *s){*this=s;} と、書いただけです。 宜しくお願いします。

glarelance
質問者

補足

補足です。 multiString(const wchar_t *s){*this=s;} と「/* multiString class自体に代入 */」の部分に書いたときは、 void main(void){ multiStringstr(L"atatea"); } とメイン文に書いてやると例外が発生します。 宜しくお願いします。

すると、全ての回答が全文表示されます。
回答No.1

>multiString(const wchar_t *s)std::wstring(s); こんな記述できますか? multiString(const wchar_t *s) : std::wstring(s) {} では? あと、operator + あたりが必要になったような気もする。

glarelance
質問者

お礼

すみません、正しくは multiString(const wchar_t *s){std::wstring(s);} とか、 multiString(const wchar_t *s){*this=s;} として、試したんです。 一応、 this->assign(s); としてやれば、代入できるようにはなったのですが、wstringクラスを継承した場合、何故このようなエラーが出るのでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A