澄清您想要在LogicComponent上执行的操作 . 假设您正在尝试实现以下目标:
第1步:向 Map 添加新条目:
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返回的info对象是您添加到 Map 中的对象的COPY . 通过修改它,您不会修改 Map 中的内容 .
最简单的解决方法是创建指向对象而不是对象本身的指针映射 .
typedef std::map 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];
此外,请使用访问器方法来获取映射值,而不是将 Map 对象公开为public . 使实例变量受保护,并添加一个公共get()方法 .
编辑:这段代码对我来说很好:
#include
#include
using namespace std;
template
class Component
{
public:
typedef map 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 {};
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;
}