如何解决具有保护可见性的变量的风险是什么
我正在尝试实现此 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 方法,但如果我想对正确的上下文采取行动,我将不得不返回一个引用或指针,这与此具有相同的效果,但只需要额外的代码)。
解决方法
-
你说的不对
我将不得不返回一个引用或指针,其效果与此相同,但只需要额外的代码
因为通过保护指针来暴露指针允许派生类型 操作指针本身,而不仅仅是底层数据。
-
来自文档 misc-non-private-member-variables-in-classes 检查哪个
cppcoreguidelines-non-private-member-variables-in-classes
是一个 别名:数据成员应声明为私有并通过成员函数访问,而不是暴露给派生类或 类消费者。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。