请参阅Wikipedia:Strategy Pattern (C++)
class Context
{
private:
StrategyInterface * strategy_;
public:
explicit Context(StrategyInterface *strategy):strategy_(strategy)
{
}
void set_strategy(StrategyInterface *strategy)
{
strategy_ = strategy;
}
void execute() const
{
strategy_->execute();
}
};
为什么在Context的构造函数中使用explicit是一个好习惯?
谢谢
答案 0 :(得分:13)
因为除非确实想要允许隐式转换,否则使用explicit
通常是个好主意。由于在真正从隐式转换获得任何内容的情况下,您不太可能使用Context
对象,因此最好将其设为explicit
。
答案 1 :(得分:6)
嗯,显式构造函数总是安全的,但可能不方便。 explicit
如果您提供StrategyInterface*
预期Context
,则会确保编译错误。这样做会阻止构建临时Context
。这在某些情况下变得特别重要,例如:
Context
获取指向StrategyInterface
的所有权,并在析构函数中删除它Context
施工/销毁执行其他昂贵或不当行为Context
和StrategyInterface*
产生编译时错误,导致比较StrategyInterface*
,StrategyInterface
或Context
s?)如果Context
实际上是StrategyInterface
的替代品,只需要一些小的日志记录或其他增强功能,那么允许隐式构造可能是合适的,就像{{1可以从std::string
构造。如果它们显然是独立的事物,或者const char*
的生命周期应该超出任何给定的Context
使用范围,那么就会显示一个显式的构造函数。
(注意:这些指南非常粗略 - 更多的是起点而不是结束 - 欢迎评论)