C ++ - Почему мы должны использовать явный в этом конструкторе? - PullRequest
3 голосов
/ 08 ноября 2010

Пожалуйста, обратитесь к Википедия: шаблон стратегии (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?

Спасибовы

Ответы [ 2 ]

13 голосов
/ 08 ноября 2010

Поскольку обычно рекомендуется использовать explicit, если вы действительно не хотите разрешить неявное преобразование.Поскольку вы вряд ли будете использовать объект Context в ситуации, когда вы действительно что-то получите от неявного преобразования, вам лучше сделать его explicit.

6 голосов
/ 08 ноября 2010

Ну, явные конструкторы всегда безопасны, но могут быть неудобны. explicit гарантирует ошибку компиляции, если вы предоставите StrategyInterface*, где ожидается Context. При этом он предотвращает строительство временного Context. Это становится особенно важным в определенных обстоятельствах, например:

  • Context вступает во владение указанным StrategyInterface и удаляет его в деструкторе
  • Context Строительство / разрушение выполняет другие дорогостоящие или неуместные действия
  • он однозначно устраняет неоднозначность некоторых операций и делает другие неоднозначными, тогда как программист мог бы подумать, как устранить неоднозначность (например, попытка сравнить Context и StrategyInterface* приведет к компиляции ошибка времени, результат сравнения StrategyInterface* с, StrategyInterface с или Context с?)

Если Context практически является заменой для StrategyInterface, просто с некоторыми незначительными регистрациями или другими улучшениями, тогда может быть целесообразно разрешить неявное построение, так же как std::string может быть построено из const char*. Когда они явно независимы или когда время существования Context должно существовать вне любого данного использования StrategyInterface, тогда указывается явный конструктор.

(Примечание: эти рекомендации довольно грубые - скорее отправная точка, чем конец - комментарии приветствуются)

...