3

次の例のように、初期化リストを使用するようにコンストラクターを変更したいと思います。

class Foo
{
public:
   Foo(std::wstring bar);
private:
   std::wstring bar;
};

// VERSION 1:

Foo::Foo(std::wstring bar) {this->bar = bar}

// VERSION 2:

Foo::Foo(std::wstring bar) : this->bar(bar) {} // ERROR!

this残念ながら、バージョン2はまだ存在していないため、データメンバーのポインターを使用できないため、バージョン2を実行できません。それでは、名前の非表示の問題に対処するにはどうすればよいですか(つまり、パラメーターとデータメンバーの名前が同じです)。

4

4 に答える 4

4

あなたはする必要はありません。1つ目barはメンバーを参照し、2つ目barは引数を参照します。

Foo::Foo(std::wstring bar) : bar(bar) {}
于 2013-02-05T20:32:26.003 に答える
2

引数の名前を変更して、どちらがどちらかが明確になるようにします。

Foo::Foo(std::wstring b) : bar(b) {}

厳密に行う必要はありませんが、コードの将来のメンテナはおそらくあなたに感謝するでしょう。

代替オプション:

C ++では、プライベートメンバー変数を特別な命名規則(末尾の下線など)で示すのが一般的です。これでこの問題はうまく解決されます。

class Foo
{
public:
   Foo(std::wstring bar);
private:
   std::wstring bar_;
};

Foo::Foo(std::wstring bar) : bar_(bar) {}
于 2013-02-05T20:32:32.947 に答える
2

あなたは実際にこれを行うことができます:

Foo::Foo(std::wstring bar) : bar(bar) {}

mustの後に使用されるすべての初期化子は:、基本クラスまたは一部のメンバーのいずれかを参照する必要があります。つまりbar、その時点でメンバーが非表示になることはありません。

于 2013-02-05T20:32:34.867 に答える
1

コンパイラは何をすべきかを知っています...これを削除するだけです->

于 2013-02-05T20:34:37.067 に答える