Sto cercando di mappare alcuni struct ad alcuni altri casi, come questo:casi struct memorizzazione in uno std :: map
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;
};
};
Poi uso in questo modo:
struct UnitInfos {
int owner_id;
int health;
float x, y;
};
class LogicComponent : public Component<UnitInfos> {};
Il problema è che quando in seguito recuperare i dati in seguito, in questo modo:
comp.instance[id];
ho un nuovo oggetto breand con proprietà inizializzate a valori di default.
C'è qualcosa di intrinsecamente sbagliato in questo pezzo di codice, o sto tralasciando informazioni sul problema?
Come da @aaa suggerimento, modificare il codice per
typedef std::map<EntityID, T> instances_map;
instances_map instances;
T& add(EntityID id) {
instances[id] = T();
return instances[id];
};
ma quando accedo che
UnitInfos &info = logic_c.instances[id];
il valore di info.x è ancora 0. Tutti gli indicatori?
Il problema era come ho memorizzato il riferimento a LogicComponent in un'altra classe. utilizzando LogicComponent logic_c;
anziché LogicComponent& logic_c;
. Ora funziona, ma sto memorizzando i puntatori nella mappa (invece del suggerimento di @ aaa). È una cattiva idea?
Ci _is_ qualcosa di intrinsecamente sbagliato con questo pezzo di codice: non creare il 'T' dinamicamente. Non c'è motivo per farlo, e come è scritto ora, si perde quell'oggetto. Per quanto riguarda il problema che stai vedendo, dovrai pubblicare l'implementazione dell'operatore minore di per "EntityID" e come stai chiamando "operator []' sulla mappa (cioè come crei l'id che passi a " operatore [] '?). –
EntityID è appena definito come 'typedef unsigned long EntityID;'. – sharvey