C ++の基本原則C.50:あなたは建設時に「仮想行動」に必要がある場合は、使用のファクトリ関数

C.50:あなたが必要とする用途工場A機能IF初期化中の「仮想行動」
C.50:あなたはファクトリ関数を使用して、コンフィギュレーションプロセスで「仮想行動」に必要がある場合

 

理由(理由)

基底クラスのオブジェクトの状態は、オブジェクトの派生部分の状態に依存しなければならない場合は不完全に構築されたオブジェクトを誤用する機会の窓を最小限に抑えながら、我々は仮想関数(または同等品)を使用する必要があります。

基底クラスのステータスは、オブジェクトの派生部分に依存しなければならない場合は、我々は仮想関数(または同等品)を使用する必要があり、時間窓を圧縮するように構築物の完成を不適切に使用されている完璧ではありません。

 

Note(注意)

工場の戻り値の型は、通常はデフォルトでunique_ptrをする必要があります。いくつかの用途が共有されている場合、呼び出し側はshared_ptrのにunique_ptrを移動することができます。しかし、工場の作者が返されたオブジェクトのすべての使用は、割り当てを保存するために、体内でmake_shared用途、リターンのshared_ptrと使用を共有することになることを知っている場合。

工場出荷時のデフォルトの戻り値の型は、通常、unique_ptrを返す必要があります。あなたには、いくつかの使用を共有する必要がある場合、呼び出し側は、shared_ptrのにunique_ptrを移動することができます。著者は返されたオブジェクトのすべての植物の使用が共有している知っている場合は、本体内の時間のメモリ割り当てセーブ機能make_shared使用できるように、しかし、あなたは、shared_ptrのを返すことができます。

 

例えば、悪い(陰性試料)

 

class B {
public:
    B() {
        /* ... */
        f(); // BAD: C.82: Don't call virtual functions in constructors and destructors
        /* ... */
    }

    virtual void f() = 0;
};

 

 

実施例(実施例)

class B {
protected:
    class Token {};

public:
    explicit B(Token) { /* ... */ }  // create an imperfectly initialized object
    virtual void f() = 0;

    template<class T>
    static shared_ptr<T> create()    // interface for creating shared objects
    {
        auto p = make_shared<T>(typename T::Token{});
        p->post_initialize();
        return p;
    }

protected:
    virtual void post_initialize()   // called right after construction
        { /* ... */ f(); /* ... */ } // GOOD: virtual dispatch is safe
};

class D : public B {                 // some derived class
protected:
    class Token {};

public:
    explicit D(Token) : B{ B::Token{} } {}
    void f() override { /* ...  */ };

protected:
    template<class T>
    friend shared_ptr<T> B::create();
};

shared_ptr<D> p = D::create<D>();  // creating a D object

 

make_sharedはコンストラクタが公開されていることが必要です。私たちは野生に脱出不完全に構築されたオブジェクトを避けるように、保護されたトークンを要求することによってコンストラクタは公に、もはや呼び出すことはできません。ファクトリ関数は、create()を提供することにより、我々は(フリーストア上)建設の便利を作ります。

Make_sharedコンストラクタ呼び出しは、パブリックでなければなりません。公に私たちは、オブジェクトが完全にから構成されませんので避けることを、コンストラクタのトークン保証保護を必要とすることによって呼び出すことはできません。)ファクトリメソッドは、(作成提供することによって、プロセスは(フリーストレージに)構成することが便利に行うことができます。

 

Note(注意)

 

従来の工場の機能は、無料ストアではなく、スタックまたは囲んでいるオブジェクトに割り当てます。

従来のファクトリメソッドは、代わりのオブジェクト内に、フリーストアのオブジェクトを割り当てまたはスタックを閉じます。

 

 

説明リンク

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c50-use-a-factory-function-if-you-need-virtual-behavior-during-initialization

 


 

私はこの記事は参考になりましだと思いますか?ようこそ親指アップし、より多くの人と共有することができます。

より多くの更新の記事を読む、オブジェクト指向の考え方のマイクロチャンネル公衆数にしてください注意を払います[]

公開された408元の記事 ウォンの賞賛653 ビュー290 000 +

おすすめ

転載: blog.csdn.net/craftsman1970/article/details/104578358