Налицо непонимание разницы между классом и объектом.
Класс - это тип данных. Через RTTI, конечно, можно получить объекты, описывающие типы. Только с ними ты ничего не сделаешь. И вообще это не нужно.
А нужно множество глобально доступных
объектов.
class X { /* ... */ };
class Y { /* ... */ };
class GlobalDictionary
{
public:
static X x;
static Y y;
};
Тогда в коде программы можно к ним обращаться:
/* ... */ GlobalDictionary::x /* ... */
/* ... */ GlobalDictionary::y /* ... */
Но это жёсткий перечень, задаваемый при компиляции. Тебе же надо менять состав объектов. Значит нужен массив. Чтобы разнородные объекты хранить в общем массиве, классы этих объектов должны быть унаследованы от общего предка.
#include <vector>
using namespace std;
class Parent { /* ... */ };
class X: public Parent { /* ... */ };
class Y: public Parent { /* ... */ };
class GlobalDictionary
{
public:
typedef ParentsVector vector<Parent>;
static ParentsVector objects;
};
Тогда в коде программы можно к ним обращаться:
/* ... */ GlobalDictionary::objects[0] /* ... */
/* ... */ GlobalDictionary::objects[1] /* ... */
Если порядковые номера хочется заменить на осмысленные названия, то можно либо ввести enum, либо вместо массива типа vector использовать словарь типа map.