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是危险的做法还是一个好的解决方案?
注意:这里MyClass1和MyClass2只是一个例子.我的问题非常"一般":Wrapper当getter/setter返回/设置内部值时,用提议替换类的getter/setter是危险的.
正如您所提到的,getter 和 setter 的主要目的是提供访问和设置私有实例变量的统一方法。
从你的包装器解决方案中,如果在程序生命周期的某个时候你决定更改 setter,你可以扔掉包装器并将其替换为原始的 getter/setter,就像 MyClass1 中一样——而不必更改该包装器的所有其他组件调用它的代码。
因此,从那时起,我认为您的解决方案是避免您键入额外几行代码的有效方法。
| 归档时间: |
|
| 查看次数: |
1611 次 |
| 最近记录: |