2014-04-25 8 views
21

Ho file di configurazione che ho includere in tutti i miei file lì mi hanno diverse enumerazioni, ma all'interno di ogni enum ci sono stessi nomi degli elementi ad esempio: config.hC++ come avere lo stesso nome di enum in diversi nomi enum senza errori: ridefinizione; precedente definizione era 'enumeratore'

enum GameObjectType 
{ 
    NINJA_PLAYER 

}; 
enum GameObjectTypeLocation 
{ 
    NONE, 
    MASSAGE_ALL, //this is for ComponentMadiator 
    NINJA_PLAYER 


}; 

Ma quando provo a compilare il progetto con chiamando i enumerazioni con il corretto nome enum

m_pNinjaPlayer = (NinjaPlayer*)GameFactory::Instance().getGameObj(GameObjectType::NINJA_PLAYER); 
    ComponentMadiator::Instance().Register(GameObjectTypeLocation::NINJA_PLAYER,m_pNinjaPlayer); 

sto ottenendo errore di compilazione:

error C2365: 'NINJA_PLAYER' : redefinition; previous definition was 'enumerator' (..\Classes\GameFactory.cpp) 
2>   d:\dev\cpp\2d\cocos2d-x-3.0\cocos2d-x-3.0\projects\lettersfun\classes\config.h(22) : see declaration of 'NINJA_PLAYER' 

Come posso mantenere nel config.h diverse enumerazioni con nomi diversi MA con gli stessi nomi di elementi?

risposta

27

Il problema è che le enumerazioni vecchio stile sono senza ambito. È possibile evitare questo problema (a condizione che il compilatore ha il relativo supporto C++ 11) utilizzando enumerazioni di ambito:

enum class GameObjectType { NINJA_PLAYER }; 

enum class GameObjectTypeLocation { NONE, MASSAGE_ALL, NINJA_PLAYER }; 

In alternativa, potete mettere i vostri elenchi vecchia scuola in spazi dei nomi:

namespace foo 
{ 
    enum GameObjectType { NINJA_PLAYER }; 
} // namespace foo 

namespace bar 
{ 
    enum GameObjectTypeLocation { NONE, MASSAGE_ALL, NINJA_PLAYER }; 
} // namespace bar 

Quindi i valori dell'enumerazione saranno foo::NINJA_PLAYER, bar::NINJA_PLAYER ecc.

+0

Grazie non sapevo che C++ 11 può usare la classe nelle enumerazioni – user63898

+0

non sembra funzionare in linux ... –

+0

@ diego.martinez Non dipende dal SO. È una cosa in C++. – juanchopanza

5

Se avete la possibilità di utilizzare C++ 11 Io consiglierei di utilizzare la funzione di classe enum per evitare collisioni:

enum class GameObjectType 
{ 
    NINJA_PLAYER 

}; 
enum class GameObjectTypeLocation 
{ 
    NONE, 
    MASSAGE_ALL, //this is for ComponentMadiator 
    NINJA_PLAYER 


}; 

Edit: Se non si dispone di questa capacità, allora si avrà bisogno di utilizzare due diversi namespace per ogni enum.

+1

Due diversi spazi dei nomi o avvolgere ogni enumerazione con una classe. –