具有保护可见性的变量的风险是什么

我正在尝试实现此 example 中所述的状态模式。我已经编写了类似于下面的代码。

class State {
public:
    virtual void enter() {};
    virtual void update() = 0;
    virtual void exit() {};

    virtual void setContext(Context* cxt) {
        this->context = cxt;
    }
protected:
    Context* context;
};

class Context {
public:
    void do_something();
    void do_something_else();

    void transitionTo(std::unique_ptr<State> next_state) {
        if (state != nullptr) {
            state->exit();
        }
        state = std::move(next_state);
        state->setContext(this);
        state->enter();
    }

private:
    std::unique_ptr<State> state;
};

class ConcreteStateA : public State {
public:
    void update() override {
        try {
           context->do_something();
        } catch {
           context->transitionTo(std::unique_ptr<ConcreteStateB>());
        }
    }   
};

class ConcreteStateB {
 // ...
};

但是,当我尝试使用 clang-tidy 编译它时,我收到以下警告

error: member variable 'context' has protected visibility [cppcoreguidelines-non-private-member-variables-in-classes,-warnings-as-errors]

我有以下两个问题:

  1. 提供具有受保护可见性的变量有哪些风险?
  2. 有人对如何以干净的方式解决此错误有任何建议吗? (我已经考虑过创建一个受保护的 getter 方法,但如果我想对正确的上下文采取行动,我将不得不返回一个引用或指针,这与此具有相同的效果,但只需要额外的代码)。
iCMS 回答:具有保护可见性的变量的风险是什么

  1. 你说的不对

    我将不得不返回一个引用或指针,其效果与此相同,但只需要额外的代码

    因为通过保护指针来暴露指针允许派生类型 操作指针本身,而不仅仅是底层数据。

  2. 来自文档 misc-non-private-member-variables-in-classes 检查哪个 cppcoreguidelines-non-private-member-variables-in-classes 是一个 别名:

    数据成员应声明为私有并通过成员函数访问,而不是暴露给派生类或 类消费者。

本文链接:https://www.f2er.com/169791.html

大家都在问