我有一个关于 C++ 中备受评论的 C++ 引用 getter-setter 的问题。这是基本代码:
class Foo
{
X x_;
public:
X & x() { return x_; }
const X & x() const { return x_; }
}
我的问题是:如果我在设置时需要检查该值怎么办?假设我正在设置坐标的纬度。如果我写一个
setLat
方法,它看起来像这样:
void MyClass::setLat(double lat)
{
if (lat < -90 || lat > 90)
{
throw std::range_error("The latitude must be between -90 and 90.");
}
_lat = lat;
}
我可以做类似的事情吗:
double & MyClass::lat()
{
return _lat;
}
如果你想封装数据,那就封装数据。返回非常量引用会破坏封装。一旦获得参考,呼叫者就可以做任何他们想做的事情。您想要的行为可以通过返回代理来实现:
#include<iostream>
struct foo {
struct proxy {
proxy(int& _value) : _value(_value) {}
proxy& operator=(int value) {
if (value != 42) throw "bad value";
_value = value;
return *this;
}
operator int () { return _value; }
private:
int& _value;
};
proxy get() { return {x}; }
int get() const { return x; }
private:
int x = 0;
};
int main(){
foo f;
f.get() = 42;
std::cout << f.get();
}
但是,提供一个实际的 setter 会简单得多
foo::set(int)
。