2016-10-09 10 views
-1

ここでは、クラスが同じコンストラクタパラメータを持つすべてのinstatiationについて同じオブジェクトを参照するようにします(オブジェクトが既に存在する場合、インスタンス化する新しい変数は既存のオブジェクトを返す必要があります)。同じ値を持つものを作成するよりも)。 意味論的なやり方はありますか?または、クラス内のすべてのオブジェクトを含む静的ベクトルを保持し、同じパラメータが存在する場合はコンストラクタをチェックインするのに最適な方法ですか?クラスメンバの一意性

+0

「シングルトンクラス」が必要です:http://www.yolinux.com/TUTORIALS/C++Singleton.htmlまたはgoogle it! –

+0

シングルトンパターンをルックアップします。 – Peter

+1

それらの多くがある場合、それはシングルトンではありません... –

答えて

0

あなたは、いくつかの同様の操作を行うことができますパラメータからハッシュを作成することができた場合:

class YourClass 
{ 
    static std::unordered_map< std::string, YourClass > s_instances; // You can use std::map as well 

    static YourClass& get_instance(paramtype1 param1, paramtype2 param2); 

    static std::string create_hash(paramtype1 param1, paramtype2 param2); 
    // The implementation depends on the type of parameters 
}; 

std::unordered_map< std::string, YourClass > YourType::s_instances; 

YourClass& YourClass::get_instance(paramtype1 param1, paramtype2 param2) 
{ 
    auto hash = create_hash(param1, param2); 
    auto it = s_instances.find(hash); 
    if (it == s_instances.end()) 
    { 
     return it->second; 
    } 
    else 
    { 
     s_instances[ hash ] = YourType(param1, param2); 
     return s_instances[ hash ]; 
    } 
} 

は、当然のことながら、あなたが答えているか疑問のトンがあります 1.この操作スレッドセーフする必要がありますか?私。複数のスレッドで並列にアクセスすることもできますか?はいの場合は、s_instancesをパラレル変更から保護する必要があります。

  1. 破壊フェーズはどのように見えますか?静的メンバーは、作成の逆の順序で破棄され、実行されるタイミングを制御することは非常に困難です。これは、デストラクタであるYourClassに必要なリソースが既に破棄されている可能性があることを意味します。そのため、私はいくつかのコントロールされた破壊フェーズを提案します。ここでは、要素が削除されて破壊されます。