我正在尝试将一些结构体映射到其他实例,就像这样:
template <typename T>
class Component {
public:
typedef std::map<EntityID, T> instances_map;
instances_map instances;
Component() {};
T add(EntityID id) {
T* t = new T();
instances[id] = *t;
return *t;
};
};
然后我像这样使用它:
struct UnitInfos {
int owner_id;
int health;
float x, y;
};
class LogicComponent : public Component<UnitInfos> {};
问题在于当它稍后检索数据时,像这样:
comp.instance[id];
我使用默认值初始化了一个全新的对象。
这段代码有什么本质的问题,还是我遗漏了一些与问题有关的信息?
根据 @aaa 的建议,我将代码更改为:
typedef std::map<EntityID, T> instances_map;
instances_map instances;
T& add(EntityID id) {
instances[id] = T();
return instances[id];
};
但是当我访问它时
UnitInfos &info = logic_c.instances[id];
信息.x的值仍然是0。有什么指针吗?
问题在于我如何在另一个类中存储对LogicComponent的引用。使用LogicComponent logic_c;
而不是LogicComponent& logic_c;
。现在它可以工作,但是我正在将指针存储在地图中(而不是@aaa的建议)。这是个坏主意吗?
T
。没有理由这样做,而且现在的写法会导致对象泄漏。至于你看到的问题,你需要发布EntityID
的小于运算符实现以及你如何调用地图上的operator[]
(也就是你如何创建传递给operator[]
的 ID )。 - James McNellistypedef unsigned long EntityID;
。 - sharvey