gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:20 25 4
gpt4 key购买 nike

考虑以下类:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com