我的问题是,我试图访问类成员常量引用的非常量 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/