Уточните операции, которые вы хотите выполнить на LogicComponent.Предполагая, что вы пытаетесь достичь чего-то вроде этого:
Шаг 1: Добавьте новую запись на карту:
LogicComponent comp;
EntityID id = 99;
UnitInfos info = comp.add(id);
Шаг 2: Инициализируйте информацию:
info.x = 10.0;
info.y = 11.0
// etc
Шаг 3: снова получить информационный объект:
UnitInfos info2 = comp.instances[id]; // this is uninitialized.
Затем несколько комментариев к коду расположены по порядку:
Информационный объект, возвращаемый comp.add, является копией объектаВы добавили на карту.Изменяя его, вы не изменяете то, что находится на карте.
Самое простое решение - создать карту указателей на объект, а не на сам объект.
typedef std::map<EntityID, T*> pinstances_map;
T * add(EntityID id) {
T* t = new T();
instances[id] = t;
return t;
};
// initialize as
UnitInfo *info = comp.add(id);
info->x = 10.0;
info->y = 11.0;
// retrieve as
UnitInfos *info = comp.instances[id];
Кроме того, используйте метод доступа, чтобы получить сопоставленное значение, вместо того, чтобы выставлять объект карты как открытый.Сделайте переменную экземпляров защищенной и добавьте публичный метод get ().
Редактировать: Этот код отлично работает для меня:
#include <map>
#include <iostream>
using namespace std;
template<typename T>
class Component
{
public:
typedef map<long, T*> pinstances_map;
pinstances_map instances;
T * add(long id)
{
T *t = new T();
instances[id] = t;
return t;
}
};
struct UnitInfo
{
float x, y;
};
class LogicComponent: public Component<UnitInfo> {};
int main()
{
LogicComponent comp;
UnitInfo *info = comp.add(99);
info->x = 10.0;
info->y = 11.0;
UnitInfo *info2 = comp.instances[99];
cout << info2->x << " " << info2->y;
return 0;
}