使用值包装器和operator()重载来简化getter/setter设计:一种危险的做法?

Vin*_*ent 6 c++ wrapper getter-setter c++11

考虑以下课程:

class MyClass1
{
    public:
        double x() const {return _x;} // getter
        double y() const {return _y;} // getter
        double z() const {return _x*_y;} // getter
        void x(const double var) {_x = var;} // setter
        void y(const double var) {_y = var;} // setter
        void z(const double var) {_x = var; _y = 1;} // setter
    protected:
        double _x;
        double _y;
};
Run Code Online (Sandbox Code Playgroud)

由于实际内容MyClass1是一个实现细节,getter和setter提供了一种统一的方法来获取和设置类内容,即使它们是相互依赖的(这里_z内部不存在,但对于用户来说,z是一个类似x和的变量y).

现在要避免必须为x和编写getter/setter y,可以使用这样的包装器:

template <typename Type>
class Wrapper
{
    public:
        constexpr Wrapper(const Type& value) {_value = value;}
        constexpr Type& operator()() {return _value;}
        constexpr const Type& operator()() const {return _value;}
        constexpr void operator()(const Type& value) {_value = value;}
    protected:
        _value;
};
Run Code Online (Sandbox Code Playgroud)

现在原来的班级成了:

class MyClass2
{
    public:
        Wrapper<double> x;
        Wrapper<double> y;
        double z() const {return x*y;} // getter
        void z(const double var) {x = var; y = 1;} // setter
};
Run Code Online (Sandbox Code Playgroud)

避免必须写入getter/setter是危险的做法还是一个好的解决方案?

注意:这里MyClass1MyClass2只是一个例子.我的问题非常"一般":Wrapper当getter/setter返回/设置内部值时,用提议替换类的getter/setter是危险的.

ger*_*tan 1

正如您所提到的,getter 和 setter 的主要目的是提供访问和设置私有实例变量的统一方法。

从你的包装器解决方案中,如果在程序生命周期的某个时候你决定更改 setter,你可以扔掉包装器并将其替换为原始的 getter/setter,就像 MyClass1 中一样——而不必更改该包装器的所有其他组件调用它的代码。

因此,从那时起,我认为您的解决方案是避免您键入额外几行代码的有效方法。