我正在尝试实现此 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]
我有以下两个问题:
- 提供具有受保护可见性的变量有哪些风险?
- 有人对如何以干净的方式解决此错误有任何建议吗? (我已经考虑过创建一个受保护的 getter 方法,但如果我想对正确的上下文采取行动,我将不得不返回一个引用或指针,这与此具有相同的效果,但只需要额外的代码)。