c++ - 如何在返回常量引用的类成员上正确调用 setter

标签 c++ class getter-setter mutable

我的问题是,我试图访问类成员常量引用的非常量 setter ,导致错误 (C2662)。如果我将要设置的值设置为可变的,并且将 setter 设置为常量,那么我没问题,但我读到你应该避免这样做,但找不到另一种方法来做到这一点。

vector2D的定义:

class vector2D {
    int _x;
    int _y;
public:
    vector2D() :
    _x(0),
    _y(0) {};

    // Getters
    int xGet() { return _x;};
    int yGet() { return _y;};

    // Setters
    void xSet(int x) {
        if (x > 100) {
            _x = 100;
            return;

        } else if (x < 0) {
            _x = 0;
            return;

        } else {
            _x = x;
            return;
        }
    };

    void ySet(int y) {
        if (y > 100) {
            _y = 100;
            return;

        } else if (y < 0) {
            _y = 0;
            return;

        } else {
            _y = y;
            return;
        }
    };
};

npc的定义:

class npc {
    vector2D _position;
public:
    npc () {};
    const vector2D& positionGet() const{
        return _position;
    };
};

main.cpp :

main () { 
    vector2D myPos;
    myPos.xSet(2);    //Okay

    npc myGuy;
    myGuy.positionGet().xSet(2);    //C2662

    return 0;
}

我尝试过的:

我试图创建 xSet/ySet 常量函数,但是这给了我一个错误(表达式必须是一个可修改的左值),这是有道理的。我一直在阅读有关此的文章,但正确的方法从未真正明确。

我试着让 x/y 可变,然后让我让 setter 函数保持常量,这确实消除了错误,但后来我读到很多人说不要使用可变的,还有什么其他方法应该这样做吗?

我也试图让 '_position' 的返回值不是常量,但这不是不安全吗???

注意:我也在努力让我的问题更好,所以请留言/发表评论,告诉我如何更好地提出这个问题:D


编辑:我发现了什么

所以很多人建议只返回一个非常量引用的'_position',但我发现这个问题是你可以直接给返回的引用赋值。

vector2D newPos;
myGuy.positionGet() = newPos;

这是不好的,因为返回值是私有(private)成员,因此不应该直接赋值。 这也很糟糕,因为如果 npc 通过引用传递给函数,然后完成上述操作,一旦它超出范围,它就会调用 vector2D 上的析构函数。

void functTest (npc & ch1) {
    vector2D c1;
    ch1.positionGet() = c1;

    return;
}

出于某种原因也破坏了 ch1._position ???

最佳答案

如果您希望您的 getter 返回一个可变引用,那么这样做

您想调用 positionGet() 并获取一个您可以修改的对象。

所以不要让它成为 const!

vector2D& positionGet() {
    return _position;
};

简单如。

关于c++ - 如何在返回常量引用的类成员上正确调用 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41413176/

相关文章:

c++ - 为什么这个正则表达式在 STL 世界中是错误的?

c++ - 我可以将 Visual Studio 2005 设置为在调试时忽略特定代码区域中的断言吗

c++ - 在 C++ 的类函数中引用二维数组

java - 如何获取android中getter setter方法的值?

Java 和 JSP - java.lang.NoSuchMethodError?

java - 检测图像中的物体(单词)

c++ - OpenGL 中的纹理贴图

Java - 类和方法的问题

javascript - typescript ,使用没有构造函数的类

ios - 如何使 Xcode 5 自动为 .m 中定义的属性的 Setters 和 Getters 生成代码?