#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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてください 9 2022/04/22 18:50
- C言語・C++・C# このプログラミング誰か教えてください。 2 2022/04/22 18:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
空ENTERの判別
-
switch文のエラーについて
-
名前空間でビルドエラー(LNK20...
-
C++での <iostream.h>と<iostre...
-
C言語のポインターで詰まっている
-
c++で、cvMatからvectorへの変...
-
セグメンテーションフォルトが...
-
構造体に決められた文字列を入...
-
VC++で文字列から任意の文字を...
-
string型のフォーマット書式指...
-
VS2019でofstreamが未定義になる
-
2重の(?)の#include
-
指定した文字を削除したい
-
[Win + Eclipse + GCC]socketク...
-
c++のvirtual関数および継承に...
-
vectorの中にmap
-
構造体配列のvectorへの変換と...
-
なぜ、C++の標準ヘッダをインク...
-
VHDLのsignedとunsignedの違いは?
-
enumの値から定義名を文字列化...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
enumの値から定義名を文字列化...
-
VC++で文字列から任意の文字を...
-
C言語 ストリームについて。
-
switch文のエラーについて
-
string型のフォーマット書式指...
-
構文エラーが出ているのですが...
-
空ENTERの判別
-
gccでコンパイル時のエラー
-
なぜ、C++の標準ヘッダをインク...
-
リモートデスクトップの接続元I...
-
JPEGやPNGが読めるLoadImage関数
-
mapの初期化
-
snprintfが使用できない。
-
atlbase.h と afxwin.hの同時定義
-
C言語のエラーを修正したい
-
CSting を TCHAR [] に変換した...
-
#include "fstream.h"
-
構造体配列のvectorへの変換と...
-
【C++】ヘッダ内でstringを格納...
-
CStringとString
おすすめ情報