3

请参考维基百科:策略模式(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 的构造函数使用显式是一个好习惯?

谢谢

4

2 回答 2

14

explicit因为除非您真的想允许隐式转换,否则通常使用它是一个好主意。由于您不太可能Context在您真正从隐式转换中获得任何东西的情况下使用对象,因此您最好制作它explicit

于 2010-11-08T05:10:14.373 回答
6

好吧,显式构造函数总是安全的,但可能会带来不便。 explicit如果您提供预期的 a StrategyInterface*,可确保编译错误。Context在这样做时,它可以防止构建临时Context. 这在某些情况下变得尤为重要,例如:

  • Context获取指向的所有权StrategyInterface,并在析构函数中将其删除
  • Context构造/破坏执行其他昂贵或不适当的操作
  • 它隐含地消除了某些操作的歧义,并使其他操作变得模棱两可,在这种情况下,让程序员考虑如何解决模棱两可可能更合适(例如,如果尝试比较 aContext和 aStrategyInterface*产生编译时错误,导致比较StrategyInterface*s, StrategyInterfaces还是Contexts?)

如果 aContext实际上是 a 的替代品StrategyInterface,只是带有一些小的日志记录或其他增强功能,那么允许隐式构造可能是合适的,就像std::string可以从 构造一样const char*。当它们显然是独立的事物时,或者当 a 的生命周期Context应该存在于 a 的任何给定用法之外时StrategyInterface,则指示显式构造函数。

(注意:这些指南非常粗略——更多的是起点而不是终点——欢迎评论)

于 2010-11-08T05:37:59.043 回答