3

当我尝试使用一种方法返回一个私有变量时,似乎该值自构造对象以来发生了变化。这是我的代码和输出。

主文件

#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将参数赋值给自身。成员变量保持未初始化。

您可以通过使用成员初始化器列表或通过显式引用成员变量来避免此问题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

正如其他人指出的那样

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

这是一种称为“影子变量”的条件。函数原型中的值“x”和“y”隐藏了成员变量,因此“x = x”将参数 x 的值分配给参数 x。

像 GCC 和 Clang 这样的编译器会警告你。MSVC 不是因为微软的 API 有点乱,而且他们使用了很多符号表:)

避免这种情况的一种广泛使用的方法是前缀。“m_”代表“成员”,“g_”代表“全局”,“s_”代表“静态”。

class Coordinate
{
    // by saying 'class' instead of 'struct',
    // you declared the initial state to be "private".
    int m_x;
    int m_y;
    ...


Coordinate::Coordinate(int x, int y)
    : m_x(x)
    , m_y(y)
{}

有些人更进一步,为参数名称使用前缀或后缀;我从我从事的几个开源项目中添加了“_”。

Coordinate::Coordinate(int x_, int y_)
    : m_x(x_)
    , m_y(y_)
{
    int x = m_x;  // assign from member value
    int y = y_;   // assign from parameter
    std::cout << x << ", " << y << std::endl;
}
于 2013-07-29T04:34:41.003 回答
0

尝试 :

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

     cout << this->x << endl;

}

第一次得到x = 1的值,因为它的参数'x'的值得到了打印。但是第二次你弄错了,因为成员变量 x 永远不会被分配任何值。

于 2013-07-29T03:40:32.910 回答
0

问题在于这些作业:

x = x;
y = y;

您实际上是在将构造函数参数分配给它们自己,xy不是从参数分配给对象xy成员。

另外,这条线

cout << x << endl;

打印构造函数参数x而不是对象的x成员。

您正在隐藏成员xy使用与构造函数参数名称相同的名称。引用名称x而不y限定它们将引用参数而不是对象的成员。

你可以通过做这样的事情来解决这个问题。在那,我在成员变量前面加上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 回答