我正在处理类似的事情:
我有一个非常复杂的类和一个依赖于一些东西的成员,这些东西在类初始化时没有设置,或者在运行时设置。即使未设置该成员,该类的对象也有意义。它也可以根据对其他成员所做的其他更改进行重置。
现在,假设这个“特殊”成员的设置在计算上是昂贵的,所以我会根据要求延迟计算它。
所以:
class Class
{
X x;
Y y;
SpecialClass specialObject;
public:
void setX(const X& newX);
void setY(const Y& newY);
//----
SpecialClass getSpecialObject() /*const*/
{
computeSpecialObject();
return specialObject();
}
private:
void computeSpecialObject()
{
//specialObject depends on x and y
//and is expensive to compute
//this method is a bottleneck
}
};
我不想每次更改x
或y
时都调用compute
方法,因为它很昂贵,所以我离开了与困境:
- 删除
const
?从逻辑上讲,getter 应该是const
,但它不能。还有一个缺点是它不能在const
对象上调用。 - 我可以使
specialObject
mutable
,但这似乎不是正确的做法。 - 抛弃常量?同样,看起来很可疑。
- 在获取之前调用
computeSpecialObject
? - 如果有人忘记了怎么办?他们会得到一个过时的结果。
是否有处理此问题的设计模式?一个好的方法?还是类(class)设计错了? (我倾向于最后一个,但改变类(class)并不是一个真正的选择)
注意:我把成员mutable
做了,想知道有没有更好的解决办法。
最佳答案
I can make specialObject
mutable
, but it doesn't seem like the right thing to do.
为什么会这样?这正是 mutable
存在的原因:允许 const
函数在逻辑上 const
而无需物理离开对象不变(如果您使对象可变
,请记住 ensuring thread-safety - 我相信您明白我的意思)。
只要 SpecialClass
对象的初始化不会改变对象的逻辑状态,这就是正确的,当然,因为那是 const
所 promise 的做。
在这种情况下,函数本身本质上就不是const
,它应该被命名为不同于getSpecialObject()
:computeAndReturnSpecialObject( )
可能是候选人。
关于c++ - 如何解决同时设置成员的 setter/getter ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15034134/