8

重複の可能性:
C++でのメンバーとメソッド引数のアクセス

、、、などxのメンバーがいるクラスがあります。そのコンストラクターでは、これは行いません。ywidthheight

A::A(int x, int y, int width, int height)
{
    x = x;
    y = y;
    width = width;
    height = height;
}

これは実際には意味がなく、g ++、、、でコンパイルするとxy奇妙な値widthになります(例)。height-1405737648

これらの名前の競合を解決する最適な方法は何ですか?

4

5 に答える 5

18

同じ名前で初期化リストを問題なく使用できます。

A::A(int x, int y, int width, int height) :
    x(x),
    y(y),
    width(width),
    height(height)
{
}

同じ名前を付けたくない場合は、別の名前を使用することもできます。いくつかのハンガリアン記法のバリエーションが思い浮かびます(私はこれを嫌うかもしれません):

//data members
int x_;
int y_;
int width_;
int height_;
//constructor
A::A(int x, int y, int width, int height) :
    x_(x),
    y_(y),
    width_(width),
    height_(height)
{
}

しかし、最初の提案には何の問題もありません。

于 2012-10-10T15:28:18.673 に答える
5

コンストラクターで代入を使用する必要がある場合 (初期化子のリストを使用するのではなく、優先される)、この問題に対処するための特定のパターンはthis、次のようにポインターを使用することです。

this->a = a;
于 2012-10-10T15:32:01.527 に答える
2

コンストラクターの初期化リストを使用することで問題を回避できますが、データ メンバーの命名規則 (末尾_の や先頭の など ) に従うことをお勧めしますm_xそうしないと、特にやなどの名前のメンバーがある場合に、名前の衝突が発生する可能性が非常に高くなりますy

class A
{
    public:

    A(int x, int y, int width, int height) : x_(x), y_(y), with_(width), height_(height) {}

    int x_;
    int y_;
    int width_;
    int height_;
};
于 2012-10-10T15:31:27.397 に答える
0

コンストラクターの引数の名前を変更するだけです。あなたが書くとき

A::A(int x, int y, int width, int height)
{
    x = x;
    y = y;
    width = width;
    height = height;
}

次に、コンストラクターの引数を自分自身に割り当て、実際のインスタンス変数を初期化せずに残します。そのため、偽の値が得られます。

私が提案する (そして広く使用されている) 一般的な解決策は、コンストラクター メソッドの引数の名前を変更することです。

A::A(int x_initial, int y_initial, int width_initial, int height_initial)
{
    x = x_initial;
    y = y_initial;
    width = width_initial;
    height = height_initial;
}
于 2012-10-10T15:34:27.137 に答える