3

メソッドを使用してプライベート変数を返そうとすると、オブジェクトが構築されてから値が変更されたようです。これが私のコードと出力です。

main.cpp

#include <iostream>
#include "coordinate.h"

using namespace std;

int main()
{
    Coordinate c(1, 1);
    cout << c.getX() << endl;

}

座標.cpp

#include "coordinate.h"
#include <iostream>

using namespace std;

Coordinate::Coordinate(int x, int y)
{
    x = x;
    y = y;

    cout << x << endl;

}

座標.h

#ifndef COORDINATE_H
#define COORDINATE_H

class Coordinate
{
    private:
        int x;
        int y;

    public:
        Coordinate(int x, int y);

        int getX() { return x; }
        int getY() { return y; }
};

#endif

出力

4

8 に答える 8

9

コンストラクターは、オブジェクトのプライベート フィールドではなく、その引数に代入しています。初期化リストを使用するか、割り当てターゲットを で明示的に修飾するか、this別の引数名を選択します。

Coordinate::Coordinate(int x, int y) : x(x), y(y) {
    cout << x << endl;
}

また

Coordinate::Coordinate(int x, int y) {
    this->x = x;
    this->y = y;
    cout << x << endl;
}

また

Coordinate::Coordinate(int xVal, int yVal) {
    x = xVal;
    y = yVal;
    cout << x << endl;
}
于 2013-07-29T03:40:29.123 に答える
2

コンストラクター内でxは、メンバー変数ではなく引数を参照するため、x = xそれ自体への引数の割り当ても同様です。メンバー変数は初期化されていません。

member-initializer-list を使用するか、または を通じてメンバー変数を明示的に参照することで、この問題を回避できますthis->x

Coordinate::Coordinate(int x, int y) : x(x), y(y)
{
    cout << this->x << endl;
}
于 2013-07-29T03:43:02.760 に答える
1

thisこのようなポインターを使用して、値をプライベート メンバー変数に代入しようとしましたか?

Coordinate::Coordinate(int x, int y)
{
    this->x = x;
    this->y = y;

    cout << x << endl;
}

またはできることは、thisポインターの使用を避けるためにコンストラクターのパラメーター名を変更することです

Coordinate::Coordinate(int a, int b)
{
    x = a;
    y = b;

    cout << x << endl;
}
于 2013-07-29T03:43:19.340 に答える
0

これらのコードで:

x = x;
y = y

x と y を自分自身に割り当てます。

Coordinate::Coordinate(int xVal, int yVal)
{
    x = xVal;
    y = yVal;

    cout << x << endl;
}

大丈夫だ。

最良の方法は次のとおりです。

Coordinate::Coordinate(int xVal, int yVal):x(xVal),y(yVal)
{
    cout << x << endl;
}
于 2013-07-29T04:21:13.373 に答える
0

問題は、これらの割り当てにあります。

x = x;
y = y;

実際には、コンストラクターのパラメーターxyそれ自体に割り当てており、パラメーターからオブジェクトのメンバーxyメンバーに割り当てているわけではありません。

また、この行

cout << x << endl;

xオブジェクトのxメンバーではなく、コンストラクターのパラメーターを出力します。

メンバーxを非表示yにしており、コンストラクターのパラメーターの名前と同じ名前を使用しています。名前xy修飾せずに参照すると、オブジェクトのメンバーではなくパラメータが参照されます。

他の同様のテクニックを実行することもできます。m_

于 2013-07-29T03:43:48.073 に答える
0

uselease 変数名を次のように置き換えます。

class Coordinate
{
    private:
        int a;
        int b;

    public:
        Coordinate(int x, int y)
       {
         a = x;
         b = y;

         cout << x << endl;
       }

        int getX() { return a; }
        int getY() { return b; }
};

実際、コンパイラは x のどの値を使用するか混乱しています。プライベート セクションで他の変数を使用してください。それ以外の場合は、これを使用してこれを次のように解決することもできます。

 Coordinate(int x, int y)
       {
         this->x = x;
         this->y = y;

         cout << x << endl;
       }
于 2013-07-29T03:45:18.117 に答える
0

試す :

Coordinate::Coordinate(int x, int y)
{
     this->x = x;
     this->y = y;

     cout << this->x << endl;

}

引数'x' の値が出力されたため、初めてx = 1の値を取得します。しかし、メンバー変数 x に値が割り当てられないため、2 回目は間違っています。

于 2013-07-29T03:40:32.910 に答える