我有一个在单独的线程中运行的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()

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


有人希望对内存管理问题(例如具有自定义分配器)进行重载operator->,而不仅仅是任何随机操作。
->.之间缺乏对称性


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

在这里什么是可行的方法/设计?

最佳答案

对于一个类的所有公共函数来说,调用相同的私有函数是完全可以的。您的功能只是确保隐式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
}

08-16 01:30