Как можно сопоставить типы классов с экземплярами этого класса в C ++? - PullRequest
1 голос
/ 19 декабря 2011

Я хочу иметь карту от классов до экземпляров каждого класса.Цель состоит в том, чтобы создать контейнер компонентов для игрового движка на основе компонентов, в котором объект может иметь не более одного компонента каждого типа.

В Java я мог просто использовать объекты класса в качестве ключа.Как я могу сделать что-то подобное в C ++?Мое первоначальное исследование предлагает что-то вроде использования typeid (component_instance) .name () в качестве ключа.Есть ли лучший способ сделать это?

Ответы [ 4 ]

2 голосов
/ 19 декабря 2011

В отличие от более динамичных языков, таких как Python или Java, классы в C ++ сами по себе не являются объектами. Во время выполнения они просто не существуют (с точки зрения программистов).

Ваш typeid подход не так уж и плох, но для проблем с производительностью я бы вместо строки использовал хеш или числовой идентификатор (например, целое число, определенное как статическое в вашем классе).

1 голос
/ 19 декабря 2011

C ++ классы не reified , поэтому у вас нет объектов класса.

Вы можете рассмотреть возможность использования собственных дескрипторов классов (как соглашение). Вы могли бы даже сделать свой собственный препроцессор для этого.

Возможно, вы могли бы изучать и черпать вдохновение из мета-объектной системы Qt , в которой используется препроцессор moc . Возможно, использовать объекты Qt проще, чем изобретать собственную систему метаклассов.

0 голосов
/ 19 декабря 2011

В 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;
}
0 голосов
/ 19 декабря 2011

Вы можете создать уникальные ключи для таких типов, как этот (обратите внимание, что это только для однопоточного исполнения):

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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...