Problema con variable 'global'

Iniciado por xRodak, 6 Febrero 2014, 18:52 PM

0 Miembros y 1 Visitante están viendo este tema.

xRodak

Hola ! Tengo un pequeño problema con la utilización de cierta variable global, les comento lo que tengo y el error que poseo:

Quiero crear una variable 'mMonsterData' global, que sea modificada en la clase World, y que la clase Monster pueda tener accedo a esa información modificada de la variable.

Monster.hpp

struct MonsterData;

class Monster : public Entity
{
    public:
        Monster();
    ......
};

namespace
{
    std::map<Monster::ID, MonsterData*> mMonsterData;
}


DataTables.hpp

struct MonsterData
{
   int                 hitpoints;
   unsigned int                    Type;
   unsigned int                    Size;
   unsigned int                    Element;
};


World.hpp

...
#include <Monster.hpp>
...
...


World.cpp

...
mMonsterData = Value; //<-- Inicializo mi variable con ciertos valores
...

//Más tarde

Monster(spawn.id, mTextures); // Aquí el error. Ignoren los argumentos.


Monster.cpp

#include <Monster.hpp>
#include <DataTables.hpp>

Monster::Monster(Monster::ID id, const TextureHolder& textures) //Error en el contructor de Monster
: Entity(mMonsterData[id]->hitpoints)  //<-- ERROR: mMonsterData[id]->hitpoints, si cambio esta expresion por un int, el error se corrige.
, mSprite(textures.get(mMonsterData[id]->texture)) // También debería dar error aquí
{

}


El error reside en que, mi variable 'global' modificada en World.cpp, se modificó, pero solo es utilizable en World.cpp. Desde allí puede acceder a mMonsterData[id]->hitpoints u otras de sus variables sin ningún problema. Pero al momento de querer obtener sus datos en el constructor de Monster, la aplicación de cae. Esto es porque mMonsterData aún no es inicializada en este contexto (siendo que debería ser una variable global (?) ).

Ese es mi problema, alguien sabe donde está el error? Cómo puedo hacer que al modificar dicha variable en World.cpp, estos valores modificados puedan ser obtenidos en el Monster.cpp?

Estuve averiguando sobre variables globales, y la keyword 'extern', pero estuve otro tipo de errores haciéndolo de esa manera, así que vamos por parte, primero sus opiniones.

Muchas gracias por leer y también gracias de antemano.

Saludos cordiales.

blipi

Dices que ya lo has probado, pero yo creo que será más sencillo usando `extern`.

Borras el namespace anónimo de Monster.hpp, y declaras la variables como:
extern std::map<Monster::ID, MonsterData*> mMonsterData;

Parece ser que el primer uso de mMonsterData lo haces en World.cpp, así que allí lo declaras:
std::map<Monster::ID, MonsterData*> mMonsterData;

Y debería funcionarte.


Que no te de error en la segunda línea donde comentas, es probablemente porque el compilador, tras encontrar el primer error, ya marca como incorrecta toda la inicialización y no sigue parseando.

xRodak

Muchisisisimas Gracias !

La verdad es que cambié un poco el sistema. Lo dejé un poco más ordenado. Declaré mi variable en otro hpp, y lo definí en blanco en su respectivo cpp. Haciendo esto obtenía el mismo problema, pero ahora quité el namespace indefinido y mágicamente funcionó. La verdad es que aún no entiendo porqué no funciona utilizando un namespace indefinido, pero al menos pude corregir el error.

Gracias por tu respuesta compañero, independientemente del origen del error, estoy contento de haber podido solucionarlo.