概要: C++ でシングルトン ミックスインを作成するにはどうすればよいですか? 同じ関数、プライベート コンストラクターなどをコピーしget_instance()
ないようにしていますが、これを mixin にする方法がわかりません。これは、静的インスタンスが mixin から継承するすべてのものによって共有されるためです。
各派生クラスをシングルトンにするのは簡単ですが、コードを複製せずにそれを行う方法はありますか? あなたの助けをありがとう、私は困惑しています。
コード:Registry
オブジェクトを名前で検索するため
のクラスを含むプログラムを作成しています。
#include <string>
#include <memory>
#include <map>
#include <string>
#include <assert.h>
template <typename T>
class Registry
{
private:
// make private so that the class can't be instantiated and must be used via get_instance
Registry() {}
protected:
std::map<std::string, std::shared_ptr<T> > name_to_object_ptr;
public:
static Registry<T> & get_instance()
{
static Registry<T> instance;
return instance;
}
void register_name(const std::string & name, T*obj_ptr)
{
assert( name_to_object_ptr.count(name) == 0 );
name_to_object_ptr[name] = std::shared_ptr<T>(obj_ptr);
}
const std::shared_ptr<T> & lookup_name(const std::string & name)
{
assert( name_to_object_ptr.count(name) > 0 );
return name_to_object_ptr[name];
}
int size() const
{
return name_to_object_ptr.size();
}
};
私Registry
のクラスはシングルトンです。シングルトンでなければなりません (登録されたオブジェクトが消えないようにするため)。
class DerivedRegistryA : public Registry<int>
{
};
class DerivedRegistryB : public Registry<int>
{
};
int main()
{
DerivedRegistryA::get_instance().register_name(std::string("one"), new int(1));
std::cout << DerivedRegistryA::get_instance().size() << std::endl;
DerivedRegistryA::get_instance().register_name(std::string("two"), new int(2));
std::cout << DerivedRegistryA::get_instance().size() << std::endl;
DerivedRegistryA::get_instance().register_name(std::string("three"), new int(3));
std::cout << DerivedRegistryA::get_instance().size() << std::endl;
DerivedRegistryB::get_instance().register_name(std::string("four"), new int(4));
std::cout << DerivedRegistryB::get_instance().size() << std::endl;
return 0;
}
出力:
1
2
3
4
望ましい出力:
1
2
3
1