C ++ - почему мы должны использовать явную в этом конструкторе?

StackOverflow https://stackoverflow.com/questions/4121429

  •  29-09-2019
  •  | 
  •  

Вопрос

Пожалуйста, обратитесь к Википедия: СТРАТЕГИЯ (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();
        }
};

Почему это хорошая практика, чтобы использовать явную для конструктора контекста?

Спасибо

Это было полезно?

Решение

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

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

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

(Примечание: эти рекомендации довольно грубые - больше отправной точкой, чем конец - комментарии Добро пожаловать)

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top