プロが教える店舗&オフィスのセキュリティ対策術

#include<iostream>
#include<string>
#include <stdlib.h>
#include <locale.h>
#include <boost/lexical_cast.hpp>
using boost::lexical_cast;
using namespace std;

VisualC++2008ExpressEditionで文字や数字を簡単に扱えるクラスを今作ろうとしていて以下のように作ってみました。

class multiString:public std::wstring{
public:
  multiString(const wchar_t *ws){
    /* multiString class自体に代入 */
  }
};

しかし、このwchar_tをクラスに代入する処理として、
multiString(const wchar_t *s)std::wstring(s);
とすると、「error C2082: 仮パラメータ 's' が再定義されました。」となりますし、

multiString(const wchar_t *s)*this=s;
とすると、例外が発生してしまします。

wstringだったら、簡単に代入処理として出来るのですが、継承した場合はどの様に実装すればいいのでしょうか?
宜しくお願いします。

A 回答 (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 = を呼び出せばいいんだけどね....
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/21 14:38

え~と....


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

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

お礼日時:2009/06/20 10:13

結局のところ, どのようなプログラムを書いたのですか?


できる限り省略しないで全体を出してください.

この回答への補足

補足です。
multiString(const wchar_t *s){*this=s;}
と「/* multiString class自体に代入 */」の部分に書いたときは、

void main(void){
multiStringstr(L"atatea");
}
とメイン文に書いてやると例外が発生します。
宜しくお願いします。

補足日時:2009/06/19 22:19
    • good
    • 0
この回答へのお礼

解答有り難うございます。
実際私が書いたプログラムとしては、テストのためQ1の人へのお礼で書いたように、最初に示したソースの「/* multiString class自体に代入 */」の部分に、

multiString(const wchar_t *s){std::wstring(s);}
とか
multiString(const wchar_t *s){*this=s;}

と、書いただけです。
宜しくお願いします。

お礼日時:2009/06/19 22:19

>multiString(const wchar_t *s)std::wstring(s);


こんな記述できますか?

multiString(const wchar_t *s) : std::wstring(s) {}

では?

あと、operator + あたりが必要になったような気もする。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/13 16:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!