如何在访问时验证 C++ 对象的状态而不重复

How can I validate a C++ object's state upon access without duplication

我在单独的线程中有一个 C++ 对象 运行,其状态以异步方式更新。代码类似于以下内容:

class Controller : public Listener {
public:
    // Controller methods, to be called by the user from the main thread
    // My problem is that I am obliged to duplicate the call to validateState() in all methods
    void doAction1() {
        validateState(); // explicit call to validate state
    }
    void doAction2() {
        validateState(); // explicit call to validate state duplicated here and in every doActionX() method. 
    }
    ...

private:
    // Override Listener virtual methods(which are used as callbacks), called in an async manner
    void onXYZ() override;
    void onError(std::string) override { /* update m_error */ }
    ...

    // validate that no error has occurred
    void validateState() { 
        if(m_error) throw m_error;
    }

private:
    Error m_error; // updated 
};

我想到了一个解决方案,重载 operator-> 并在内部调用 validateState() 一次,从而删除重复的调用。但是,问题是用户必须做 controller->doAction1() 而被禁止做 controller.doAction1().

我还可以用这种方法想到其他语义问题:

在这里对新添加的方法重复调用 validateState() 可以吗?目的是避免过度设计。

什么是合理的 approach/design?

class 的所有 public 函数都可以调用同一个私有函数。您的函数只是确保隐式 this 参数有效,这与任何其他参数验证相同

void Controller::doAction1(Arg1 arg1)
{
    // ensure preconditions hold
    validateState();
    validateArg1(arg1);

    // "real" code
}

void Controller::doAction2(Arg2 arg2, Arg3 arg3)
{
    // ensure preconditions hold
    validateState();
    validateArg2(arg2);
    validateArg3(arg3);

    // "real" code
}