c++ - 使用值包装器和 operator() 重载来简化 getter/setter 设计 : a dangerous practice?

标签 c++ c++11 wrapper getter-setter

考虑以下类:

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;
};

由于 MyClass1 的实际内容是一个实现细节,getter 和 setter 提供了一种统一的方式来获取和设置类内容,即使它们是相互依赖的(此处 _z 内部不存在,但对于用户而言,z 是一个变量,如 xy)。

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

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;
};

现在原来的类变成了:

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
};

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

注意:此处MyClass1MyClass2 只是示例。我的问题非常“笼统”:当 getter/setter 只是返回/设置一个内部值时,用提议的 Wrapper 替换类的 getter/setter 是否危险。

最佳答案

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

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

因此,从那时起,我认为您的解决方案是一种有效的方法,可以让您免于输入额外的几行代码。

关于c++ - 使用值包装器和 operator() 重载来简化 getter/setter 设计 : a dangerous practice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14515224/

相关文章:

c++ - MEMORY_BASIC_INFORMATION.AllocationBase IMAGE_DOS_HEADER 有效性检查

c++11 - 在给定 GLIBCXX 版本的情况下,如何找到已实现的 C++11 功能

java - 我应该如何包装来自未知来源的对象

c++ - template specialization中的type会继续计算吗?

C++ 创建一个 std::vector<float> const 对象

c++ - 所有权应该在 STL 容器调用其值的析构函数之前还是之后结束?

c++ - 在模板函数 C++ 中的 F&&,Args &&... 参数之后添加另一个函数作为参数

python - 为 python 包装 c++ 类(使用 opencv),给出 "undefined symbol"

c - 包含引用本地 C 库的本地 Perl 模块

c++ - 如何正确链接 boost 正则表达式?