C ++ - почему мы должны использовать явную в этом конструкторе?
-
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
илиContext
S?)
Если Context
практически снижает замену для StrategyInterface
, просто с некоторыми незначительными ведения журналами или другими улучшениями, то может быть уместно позволить неявному строительству, как std::string
может быть построен из const char*
. Отказ Когда они явно независимые вещи, или когда срок службы Context
должно существовать вне любого данного использования StrategyInterface
, Затем указанный явный конструктор.
(Примечание: эти рекомендации довольно грубые - больше отправной точкой, чем конец - комментарии Добро пожаловать)
Другие советы
Потому что это, как правило, хорошая идея использовать explicit
если только ты не В самом деле Хотите разрешить неявное преобразование. Так как вы вряд ли использовали Context
объект в ситуации, когда вы действительно получите что-нибудь из неявного преобразования, вам лучше сделать это explicit
.