Estoy intentando trazar algunas estructuras a algunos otros casos, como este:almacenamiento de instancias struct en un std :: mapa
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;
};
};
Entonces lo uso como esto:
struct UnitInfos {
int owner_id;
int health;
float x, y;
};
class LogicComponent : public Component<UnitInfos> {};
El problema es que cuando más tarde recuperar datos más adelante, así:
comp.instance[id];
consigo un nuevo objeto Breand con propiedades inicializadas a valores por defecto.
¿Hay algo intrínsecamente incorrecto con este fragmento de código, o estoy omitiendo información sobre el problema?
según la sugerencia @aaa, puedo cambiar el código para
typedef std::map<EntityID, T> instances_map;
instances_map instances;
T& add(EntityID id) {
instances[id] = T();
return instances[id];
};
pero cuando puedo acceder a él
UnitInfos &info = logic_c.instances[id];
el valor de info.x sigue siendo 0. Cualquier punteros?
El problema era cómo Almacené la referencia a LogicComponent en otra clase. utilizando LogicComponent logic_c;
en lugar de LogicComponent& logic_c;
. Ahora funciona, pero estoy almacenando punteros en el mapa (en lugar de la sugerencia de @aaa). ¿Es una mala idea?
Hay _es_ algo inherentemente malo con este pedazo de código: no crear el 't' dinámicamente. No hay ninguna razón para hacerlo, y tal como está escrito ahora, filtra ese objeto. En cuanto al problema que está viendo, tendrá que publicar la implementación del operador menor para 'EntityID' y cómo está llamando' operator [] 'en el mapa (es decir, ¿cómo se crea el ID que pasa a' operador [] '?). –
EntityID simplemente se define como 'typedef unsigned long EntityID;'. – sharvey