c++ - 如何解决同时设置成员的 setter/getter ?

标签 c++ design-patterns constants getter

我正在处理类似的事情:

我有一个非常复杂的类和一个依赖于一些东西的成员,这些东西在类初始化时没有设置,或者在运行时设置。即使未设置该成员,该类的对象也有意义。它也可以根据对其他成员所做的其他更改进行重置。

现在,假设这个“特殊”成员的设置在计算上是昂贵的,所以我会根据要求延迟计算它。

所以:

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

我不想每次更改xy时都调用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/

相关文章:

C++ 当我从另一个类的方法调用一个方法时它起作用但不编辑第一个方法的类变量

javascript - 我如何跟踪 FS 被 emscripten 包含的原因?

Java 装饰器模式 : Can I decorate a protected method?

ruby - 如何在没有警告的情况下重新定义 Ruby 常量?

r - 我可以使用R属性来保存物理单位吗?

c++ - 在 C++ 中存储常量

c++ - 带随 secret 钥生成的双重 AES 加密

c++ - 设计 : GraphicManager, TexturesPool,纹理

java - 关于如何设计程序的面试任务,这将与大数据一起工作

java - 实现上传功能的最佳设计模式