检查 C++ 引用设置器值

问题描述 投票:0回答:1

我有一个关于 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;
}
c++ reference getter-setter
1个回答
0
投票

如果你想封装数据,那就封装数据。返回非常量引用会破坏封装。一旦获得参考,呼叫者就可以做任何他们想做的事情。您想要的行为可以通过返回代理来实现:

#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)

© www.soinside.com 2019 - 2024. All rights reserved.