如何在C ++中将类类型映射到该类的实例?

时间:2011-12-19 14:48:08

标签: c++ types map

我希望有一个从类到每个类的实例的映射。目标是为基于组件的游戏引擎提供组件容器,其中对象最多可以具有每种组件类型中的一种。

在Java中,我可以使用类对象作为键。我怎样才能在C ++中做类似的事情?我最初的研究表明,使用typeid(component_instance).name()作为关键。有更好的方法吗?

4 个答案:

答案 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;
}