【发布时间】:2020-05-29 01:13:03
【问题描述】:
我有以下代码(我在这里删除了一些不重要的代码):
class State {
public:
virtual void enter() = 0;
virtual void update() = 0;
virtual void exit() = 0;
};
class SimpleState : public State {
public:
SimpleState() = default;
SimpleState(const SimpleState&) = default;
SimpleState(SimpleState&&) = default;
virtual ~SimpleState() = default;
public:
void enter() override;
void update() override;
void exit() override;
public:
SimpleState& operator=(const SimpleState&) = default;
SimpleState& operator=(SimpleState&&) = default;
};
由于我已经定义了析构函数并且我还需要定义其他东西(如果我记得,规则为 5),因此我添加了默认运算符以解决指导警告。
如果我通过启用 cpp 核心指南使用 Visual Studio 2019 构建它,我会收到以下警告:
SimpleState.hpp: warning C26456: Operator 'SimpleState::operator=' hides a non-virtual operator 'State::operator=' (c.128).
SimpleState.hpp: warning C26456: Operator 'SimpleState::operator=' hides a non-virtual operator 'State::operator=' (c.128).
我想摆脱它,所以我按以下方式更改了代码:
class State {
public:
virtual void enter() = 0;
virtual void update() = 0;
virtual void exit() = 0;
public:
virtual State& operator=(const State&) = 0;
virtual State& operator=(State&&) = 0;
};
class SimpleState : public State {
public:
SimpleState() = default;
SimpleState(const SimpleState&) = default;
SimpleState(SimpleState&&) = default;
virtual ~SimpleState() = default;
public:
void enter() override;
void update() override;
void exit() override;
public:
SimpleState& operator=(const SimpleState&) override = default;
SimpleState& operator=(SimpleState&&) override = default;
};
但在这种情况下,我会收到以下错误:
SimpleState.hpp: error C3668: 'SimpleState::operator =': method with override specifier 'override' did not override any base class methods
SimpleState.hpp: error C3668: 'SimpleState::operator =': method with override specifier 'override' did not override any base class methods
我做错了什么以及如何删除指南警告?
【问题讨论】:
-
我建议你改用the rule of zero。让编译器为您生成构造函数、析构函数和赋值运算符。
-
我一开始就这样做了,我得到了另一个 cpp 核心指南警告,告诉我虚拟析构函数对于派生类是显式的。我已经添加了它,然后我得到了这个问题。
-
@Jepessen 核心准则是准则,而不是更多。您必须在每种情况下评估是否有必要进行更改,并且您需要阅读github.com/isocpp/CppCoreGuidelines/blob/master/… 中的相应部分以确定如何以及是否采取行动。仅仅因为警告说明而添加东西只会使情况变得更糟。
-
那么请阅读the rule of three的第一句(同样适用于五法则):“如果一个类需要一个用户-定义 析构函数...”(强调我的)。如果你没有明确定义(实现)你的析构函数,你就没有违反“规则”。
-
好的,谢谢你的建议。我们现在开始测试这些指南,因此我们需要详细说明使用它们的更多经验。
标签: c++ visual-studio visual-studio-2019 cpp-core-guidelines