私はこのように定義されたクラスを持っています:
class MyClass
{
int x;
public:
MyClass(int x);
};
MyClass::MyClass(int x)
{ //Assign x here
}
ただし、x
コンストラクターはインスタンス変数と同じ名前であるため、コンストラクターで初期化できません。これを回避する方法はありますか(引数の名前を変更する以外に)?
私はこのように定義されたクラスを持っています:
class MyClass
{
int x;
public:
MyClass(int x);
};
MyClass::MyClass(int x)
{ //Assign x here
}
ただし、x
コンストラクターはインスタンス変数と同じ名前であるため、コンストラクターで初期化できません。これを回避する方法はありますか(引数の名前を変更する以外に)?
最良のオプションは、コンストラクターの初期化子リストを使用することです。
MyClass::MyClass(int x) : x( x ) { // Body }
ただし、このアプローチを試すこともできます。
MyClass::MyClass(int x) { this->x = x; }
ただし、インスタンス変数と同じ名前であるため、コンストラクターでxを初期化できません。これを回避する方法はありますか(引数の名前を変更する以外に)?
したがって、パラメータの名前を変更してください。
class MyClass
{
int x;
public:
MyClass(int xInitVal);
};
MyClass::MyClass(int xInitVal)
:x(xInitVal)
{ // Don't assign x here.
}
パラメータ名をローカルと同じにすることで、コードが読みにくくなります。
しないでください。あなたが出くわすほとんどすべてのスタイルガイドは、パラメータをメンバーと同じ名前にしないようにあなたに言うでしょう。
余談ですが、実際には、衝突しないメンバー変数の命名規則が必要です。これは通常、C++ハウスのコーディングルール1または2です。次に、m_foo = barを見ると、何が起こっているのかが正確にわかります。
を使用しております
int m_thingy;
私も見ました
int _thingy;
int thingy_
あなたがこれを知っていて、それをすることができなかったか、またはしなかったならば、前もって謝罪します
this->x = x;
this
現在のオブジェクトを明示的に参照するために使用できます。
this->x = x;
変数名を変更することを強くお勧めします。重複する識別子をいじることは、理由のない戦いです。
私のコードでは、すべての関数パラメーターに接頭辞'in'( "inValue")を付けています。すべてのプライベートメンバー変数にプレフィックス'm'( "mValue")を付けます。
this->x
代わりに使用してください。
このポインタを使用する
MyClass::MyClass(int x)
{
this->x = x;
}
もちろん、そもそもそのような名前の衝突がない方が良い解決策になるでしょう。
this-> x = xが機能していませんか?それが私たちがしたことです(または別のパラメーター名を使用しました)。