Dove devo inserire le mie classi enum?

6

Ho un codice che assomiglia a questo:

// Player.hpp
class Player
{
public: enum class State { RUN, WALK, STAND };
};

La classe enum State è usata dalla classe Player, così come da molti altri componenti esterni. In questo modo, ogni altro componente che ha bisogno della definizione Player::State deve includere il file Player.hpp. Non sono sicuro al 100% di questa soluzione.

Un'altra opzione sarebbe quella di mettere lo stato in un file "types.hpp" separato, in questo modo:

// types.hpp
enum class PlayerState { RUN, WALK, STAND };

Quali sono secondo te i pro ei contro di questi design?

    
posta Ignorant 19.05.2018 - 19:12
fonte

3 risposte

8

I motivi principali per inserire un tipo in una classe / struct è per la metaprogrammazione del modello o se il tipo è privato per la classe. Altrimenti, basta metterlo vicino alla classe:

// Player.hpp
...

enum class PlayerState { RUN, WALK, STAND };

class Player {
public:
  ...
private:
   PlayerState m_state;
};

In C ++, è normale che tu abbia alcune dichiarazioni di supporto per una classe. Quindi non è ragionevole applicare una dichiarazione per criterio di intestazione.

Mettere questa dichiarazione in un file separato può essere ragionevole se la PlayerState è usata separatamente dal Player . Ma dato questi nomi, è improbabile che sia così.

Le intestazioni separate sono particolarmente utili quando l'intestazione deve includere intestazioni aggiuntive per alcune dichiarazioni. Poiché il C ++ (al momento) non ha sistemi di moduli, anche i contenuti di quelle intestazioni diventano disponibili per chiunque includa l'intestazione che stai scrivendo, un impatto che vorremmo ridurre al minimo. Una soluzione alternativa a queste dipendenze dell'intestazione è quella di astrarre i dettagli delle definizioni di classe, ad es. utilizzando il polimorfismo (l'intestazione dichiara solo un'interfaccia mentre le classi di implementazione sono interne a un file .cpp) o utilizza l'idioma pImpl.

    
risposta data 19.05.2018 - 19:41
fonte
3

Questo sembra un caso in cui si desidera lo spazio dei nomi. Sono il modo naturale in C ++ per raggruppare i nomi correlati.

Gli spazi dei nomi, a differenza delle classi, possono essere riaperti. Ciò significa che puoi avere più intestazioni che aggiungono tutti allo stesso spazio dei nomi. Guarda tutte le intestazioni che contribuiscono a namespace std

    
risposta data 20.05.2018 - 02:31
fonte
-1

A volte una buona pratica è avere un file "Defs.h" che avrà le emunee e le costanti che sono usate da più classi, che includeranno quelle classi.

    
risposta data 20.05.2018 - 00:36
fonte

Leggi altre domande sui tag