
#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だったら、簡単に代入処理として出来るのですが、継承した場合はどの様に実装すればいいのでしょうか?
宜しくお願いします。
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 = を呼び出せばいいんだけどね....
なるほど、確かに、
multiString(const wchar_t *cs){std::wstring::operator =(cs);}
という風に、コンストラクタを書いておくとうまくいきました。
どうも有り難うございました。
No.3
- 回答日時:
え~と....
#1 の言われるように
multiString(const wchar_t *s) : std::wstring(s) {}
でいいのでは?
しかし Visual C++ も賢いなぁ. 確かに
multiString(const wchar_t *s){*this=s;}
だとスタックオーバーフローするよ.... コンパイラのいう通りだ....
確かに、「multiString(const wchar_t *s) : std::wstring(s) {}」と書くと代入できますが、「multiString(const wchar_t *s){*this=s;}」と書いてあっても、wstringにはwchar_tを「operator=」で代入できると思うのですが、このようにすると何故、スタックオーバーフローとなってしまうのでしょうか?
No.2
- 回答日時:
結局のところ, どのようなプログラムを書いたのですか?
できる限り省略しないで全体を出してください.
この回答への補足
補足です。
multiString(const wchar_t *s){*this=s;}
と「/* multiString class自体に代入 */」の部分に書いたときは、
void main(void){
multiStringstr(L"atatea");
}
とメイン文に書いてやると例外が発生します。
宜しくお願いします。
解答有り難うございます。
実際私が書いたプログラムとしては、テストのためQ1の人へのお礼で書いたように、最初に示したソースの「/* multiString class自体に代入 */」の部分に、
multiString(const wchar_t *s){std::wstring(s);}
とか
multiString(const wchar_t *s){*this=s;}
と、書いただけです。
宜しくお願いします。
No.1
- 回答日時:
>multiString(const wchar_t *s)std::wstring(s);
こんな記述できますか?
multiString(const wchar_t *s) : std::wstring(s) {}
では?
あと、operator + あたりが必要になったような気もする。
すみません、正しくは
multiString(const wchar_t *s){std::wstring(s);}
とか、
multiString(const wchar_t *s){*this=s;}
として、試したんです。
一応、
this->assign(s);
としてやれば、代入できるようにはなったのですが、wstringクラスを継承した場合、何故このようなエラーが出るのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
空ENTERの判別
-
C言語のエラーを修正したい
-
名前空間でビルドエラー(LNK20...
-
std::map の const 修飾について
-
C++で、環境変数の読み込み方を...
-
CStringとString
-
JPEGやPNGが読めるLoadImage関数
-
c++ ファイルからの複素数の読...
-
OpenCVでRAW画像(カラー)を開...
-
C++ 数値データファイルから2次...
-
なぜ、C++の標準ヘッダをインク...
-
2進を10進に変換するには?
-
STLのwstring型から BSTR型 へ...
-
PICでダイナミック点灯 なぜか...
-
Aの値からBの値を除するとは??
-
Enterキーを押されたら次の処理...
-
「Aに対するBの割合」と「Aに対...
-
long型の定数の末尾にLを付ける...
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++で文字列から任意の文字を...
-
switch文のエラーについて
-
【C++】ヘッダ内でstringを格納...
-
enumの値から定義名を文字列化...
-
なぜ、C++の標準ヘッダをインク...
-
gccでコンパイル時のエラー
-
C++でShowCursorを使いたい。
-
#defineの使い方について
-
VxWorks 6.4ソケット接続につい...
-
空ENTERの判別
-
OpenCVでRAW画像(カラー)を開...
-
CStringとString
-
途中からMFCを使用したい
-
snprintfが使用できない。
-
C++での <iostream.h>と<iostre...
-
_tcscat がうまくいきません(V...
-
リモートデスクトップの接続元I...
-
#define中の#のエスケープ
-
C++ 数値データファイルから2次...
-
コーディング
おすすめ情報