我希望有一个从类到每个类的实例的映射。目标是为基于组件的游戏引擎提供组件容器,其中对象最多可以具有每种组件类型中的一种。
在Java中,我可以使用类对象作为键。我怎样才能在C ++中做类似的事情?我最初的研究表明,使用typeid(component_instance).name()作为关键。有更好的方法吗?
答案 0 :(得分:2)
与Python或Java等更动态的语言不同,C ++中的类本身不是对象。在运行时,它们根本就不存在(就像程序员的观点而言)。
您的typeid
方法并不是那么糟糕,但是对于性能问题,我会使用散列或数字ID(比如类中定义为static的整数)而不是字符串。
答案 1 :(得分:1)
C ++类不是reified 所以你没有类对象。
您可以考虑使用自己的类描述符(作为约定)。您甚至可以为此制作自己的预处理器。
也许你可以从Qt meta-object system学习并从中获取灵感,它使用一个名为moc的预处理器。也许,使用正确的Qt对象比发明自己的元类系统更简单。
答案 2 :(得分:0)
您可以为此类型创建唯一键(请注意,这仅适用于单线程执行):
struct TypeManager
{
private:
static int next_id(void)
{
static int id = 0;
return ++id;
}
public:
template<typename T>
static int get_type_id(void)
{
static int const id = next_id();
return id;
}
};
用法:
int unique_bool_id = TypeManager::get_type_id<bool>();
int unique_float_id = TypeManager::get_type_id<float>();
答案 3 :(得分:0)
在JAVA中,Singleton类确保一个类只有一个实例。
同样在C ++中,如果只想创建一个类的实例,则使用Singleton模式。 使用Singleton Design模式,其中在应用程序的整个生命周期中只需要一个对象实例。
Singleton类在首次访问时被实例化,之后使用相同的实例直到应用程序退出。
Singleton Design模式通常用于控制对资源(如数据库连接或套接字)的访问。假设我们的数据库只有一个连接的许可证。 Singleton连接对象确保可以随时只建立一个连接。
#include <iostream>
using namespace std;
class Singleton
{
private:
static bool instanceFlag;
static Singleton *single;
Singleton()
{
//private constructor
}
public:
static Singleton* getInstance();
void method();
~Singleton()
{
instanceFlag = false;
}
};
bool Singleton::instanceFlag = false;
Singleton* Singleton::single = NULL;
Singleton* Singleton::getInstance()
{
if(! instanceFlag) // use the instanceFlag in all methods and functions to check if object already exists
{
single = new Singleton();
instanceFlag = true;
cout<<"NO OBJECT WAS PREVIOUSLY CREATED"<< endl;
cout<<"__________________________________________________"<< endl;
return single;
}
else
{
cout<<"OBJECT ALREADY EXISTS!!"<< endl;
cout<<"__________________________________________________"<< endl;
return single;
}
}
void Singleton::method()
{
cout << "Method of the singleton class" << endl;
}
int main()
{
Singleton *sc1,*sc2;
cout<<"Object 1"<< endl;
sc1 = Singleton::getInstance();
cout<<"Object 2"<< endl;
sc2 = Singleton::getInstance();
return 0;
}