2016-05-16 10 views
0

コンストラクタにパラメータが必要なクラスのデフォルトインスタンスを提供するための標準パターン/ベストプラクティスの方法がC++にありますか?例えば、このような使用可能:設定可能なデフォルトインスタンスの提供

  1. 1)及び2)が同じインスタンス3)が示すよう
  2. で動作

    int main() { 
        //At startup: 
        //Parameterize default instance with some runtime Data 
        Foo::initDefault(getConfigFromFile().getDefaultFooVal()); 
    
        //1) Use default instance somewhere else in the code: 
        Foo::getDefault().doSomething(); 
    
        //2) 
        Foo::getDefault().doSomethingElse(); 
    
        //3) somewhere else in the code, maybe even before the call to initDefault() 
        Foo myFoo(5); 
        myFoo.doSomething(); 
    } 
    
    void bar(const Foo& foo = Foo::getDefault()) { 
        //... do something with foo 
    } 
    

    注意こと、Foo

  3. 私は避けたいシングルトンありませんデフォルトのコンストラクタを提供する
+0

このインスタンスはプログラム全体で共有されますか?別のインスタンスを与えることの延長とそれは一種のsingletoneですか? –

+0

@HumamHelfawi:かなり有り – MikeMB

答えて

1

あなたが本当に「デフォルト」のインスタンスを許可したくない場合は、私は、シングルトンインスタンスの存在を示すために、ポインタを使用します。

struct Foo { 
    Foo(int i){...}; 

    static Foo& initDefault (int i) { 
     static Foo foo(i); 
     if (pFoo) { 
      throw "Foo's instance is already initialized."; 
      // or: foo = Foo(i); if you want to allow re-initialization 
     } 
     else { 
      pFoo = &foo; 
     } 
     return foo; 
    } 

    static Foo& getDefault() { 
     if (!pFoo) { 
      throw "Cannot get Foo's instance before initializing it."; 
     } 
     return *pFoo; 
    } 

    void doSomething(){...} 

private: 
    static Foo *pFoo; 
}; 

Foo* Foo::pFoo{nullptr}; 

以上を使用すると、シンプルを持っていますあなたのシングルトンインスタンスを動的に割り当てなくても、インスタンスが初期化されているかどうかをテストする方法です。

2

私の通常のアプローチは、次のようになります。

struct Foo { 
    Foo(int i){...}; 

    static Foo& initDefault(int i){ 
     static Foo foo(i); 
     return foo; 
    } 

    static Foo& getDefault() { 
     static Foo& foo = initDefault(-1); 
     return foo; 
    } 

    void doSomething(){...} 
}; 
+0

'initDefault(-1)'(これは明らかに望ましくないデフォルトのコンストラクタのようなものです)の作成を許可したくない場合は、private static属性を持つことができます。 'pFoo'は' nullptr'( 'static Foo * pFoo = nullptr;')に初期化され、 '' initDefault''の '' foo''に '' pFoo''をセットして '' pFoo''が '' nullptr''であれば 'getDefault'それに応じて例外をスローします。 – Holt

関連する問題