[解決済み] 委譲されたコンストラクタを使用したメンバ初期化
質問
C++11 標準を試し始めたところ、以下のようなことがわかりました。 この の質問で、init メソッドなどを持たないように、同じクラス内の別の ctor から ctor を呼び出す方法について記述されているのを見つけました。今、私は次のようなコードで同じことを試しています。
hppです。
class Tokenizer
{
public:
Tokenizer();
Tokenizer(std::stringstream *lines);
virtual ~Tokenizer() {};
private:
std::stringstream *lines;
};
cppです。
Tokenizer::Tokenizer()
: expected('=')
{
}
Tokenizer::Tokenizer(std::stringstream *lines)
: Tokenizer(),
lines(lines)
{
}
しかし、これではエラーが出てしまいます。
In constructor ‘config::Tokenizer::Tokenizer(std::stringstream*)’:
/path/Tokenizer.cpp:14:20: error: mem-initializer for ‘config::Tokenizer::lines’ follows constructor delegation
Tokenizer()の部分をリストの最初と最後に移動してみましたが、それは役に立ちませんでした。
この背景にはどのような理由があり、どのように修正すればよいのでしょうか?私は
lines(lines)
をボディに移動してみました。
this->lines = lines;
で代用するとうまくいきます。しかし、私は本当にイニシャライザーリストを使用できるようにしたいと思います。
どのように解決するのですか?
メンバの初期化を他のコンストラクタに委ねた場合、他のコンストラクタがオブジェクトを初期化することが前提になります。
完全に
を初期化することが前提です。
lines
メンバーも含む)。したがって、どのメンバーも再び初期化することはできません。
標準からの関連する引用は、(強調)です。
(§12.6.2/6) mem-initializer-list は、コンストラクタのクラス自身を示す任意の class-or-decltype を用いて、コンストラクタのクラスの他のコンストラクタに委譲することができる。mem-initializer-id がコンストラクタのクラスを指定する場合。 を指定する場合、それは唯一の mem-initializer で選択されたコンストラクタがターゲットコンストラクタである場合、そのコンストラクタは委譲コンストラクタとなります。[...]
引数を取るバージョンのコンストラクタを定義することで、これを回避することができます。 まず :
Tokenizer::Tokenizer(std::stringstream *lines)
: lines(lines)
{
}
で、デリゲーションを使ってデフォルトのコンストラクタを定義します。
Tokenizer::Tokenizer()
: Tokenizer(nullptr)
{
}
一般的なルールとして、コンストラクタのうち最も多くの引数を取るバージョンを完全に指定し、他のバージョンから委譲する必要があります(委譲の引数として希望のデフォルト値を使用します)。
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] なぜリストの初期化(中括弧を使用)が他の方法より優れているのですか?
-
[解決済み] コンストラクタのコロンメンバー(" : ")の変な構文は何ですか?
-
[解決済み】コンストラクタの初期化リストの評価順序について
-
[解決済み】std::listを繰り返しながら要素を削除することは可能ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】C++の余分な資格エラー
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?