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場合を除いて、一般的に使用することをお勧めします。暗黙的な変換から実際に何かを得る状況でオブジェクトを使用する可能性は低いため、オブジェクトを作成した方がよいでしょう。Contextexplicit

于 2010-11-08T05:10:14.373 に答える
6

明示的なコンストラクターは常に安全ですが、不便な場合があります。 aが期待される場所に aexplicitを指定すると、コンパイル エラーが確実に発生します。そうすることで、一時的な の構築を防ぎます。これは、特定の状況で特に重要になります。StrategyInterface*ContextContext

  • Context指し示す の所有権を取得StrategyInterfaceし、デストラクタでそれを削除します
  • Context建設/破壊は、他の費用のかかるまたは不適切なアクションを実行します
  • あいまいさを解決する方法をプログラマーに検討させる方が適切な場合があります (たとえば、aContextと aを比較しようとしてStrategyInterface*コンパイル時にエラーが発生した場合、s と s を比較することになります) StrategyInterface*StrategyInterfaceまたはContexts?)

aContextが実質的に a のドロップイン置換でありStrategyInterface、わずかなログ記録またはその他の拡張機能があれば、std::stringから構築できるのと同じように、暗黙的な構築を許可することが適切な場合がありますconst char*。それらが明らかに独立したものである場合、または a の有効期間が a のContext特定の使用法を超えて存在する必要があるStrategyInterface場合、明示的なコンストラクターが示されます。

(注: これらのガイドラインはかなり大雑把です - 終わりというよりは出発点です - コメントを歓迎します)

于 2010-11-08T05:37:59.043 に答える