【发布时间】:2010-07-31 02:24:24
【问题描述】:
我正在尝试将一些结构映射到其他一些实例,如下所示:
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];
info.x 的值还是 0。有指针吗?
问题是我如何将 LogicComponent 的引用存储在另一个类中。使用LogicComponent logic_c; 而不是LogicComponent& logic_c;。它现在可以工作,但我将指针存储在地图中(而不是@aaa 的建议)。这是个坏主意吗?
【问题讨论】:
-
这段代码存在一些内在错误:不要动态创建
T。没有理由这样做,正如现在所写的那样,您泄漏了该对象。至于您看到的问题,您需要发布EntityID的小于运算符实现以及如何在地图上调用operator[](即,如何创建传递给operator[]的ID ?)。 -
EntityID 刚刚定义为
typedef unsigned long EntityID;。