Domanda

Sto lavorando a un gioco e ho una domanda interessante. Ho alcuni valori costanti a livello di gioco che voglio implementare in un file. In questo momento ho qualcosa del genere:

constants.cpp

extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;

constants.hpp

extern const int BEGINNING_HEALTH;
extern const int BEGINNING_MANA;

E quindi i file solo #include " constants.hpp " Funzionava alla grande, fino a quando non avevo bisogno di utilizzare una delle costanti come parametro del modello, perché le costanti collegate esternamente non sono parametri del modello validi. Quindi la mia domanda è: qual è il modo migliore per implementare queste costanti? Temo che semplicemente inserendo le costanti in un file di intestazione si possano definire in ogni unità di traduzione. E non voglio usare le macro.

Grazie

È stato utile?

Soluzione

Sbarazzati di extern e sei pronto.

Questo codice funziona perfettamente in un'intestazione, perché tutto è "veramente costante" e quindi ha un collegamento interno:

const int BEGINNING_HEALTH = 10;
const int BEGINNING_MANA = 5;
const char BEGINNING_NAME[] = "Fred";
const char *const BEGINNING_NAME2 = "Barney";

Questo codice non può essere inserito in modo sicuro in un file di intestazione perché ogni riga ha un collegamento esterno (esplicitamente o perché non è veramente costante):

extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;
const char *BEGINNING_NAME = "Wilma";  // the characters are const, but the pointer isn't

Altri suggerimenti

Che ne dici di enum?

constants.hpp

  enum {
    BEGINNING_HEALTH = 10,
    BEGINNING_MANA = 5
  }

Usa " const statica int " nel tuo file .hpp e non inserire nulla nel file .cpp (tranne qualsiasi altro codice che hai lì ovviamente).

usa gli spazi dei nomi:

namespace GameBeginning {
    const int HEALTH = 10;
    const int MANA   = 5; 
};

allora puoi usare come player.health = GameBeginning :: HEALTH;

La maggior parte dei compilatori semplicemente non alloca spazio per valori POD const. Li ottimizzano e li trattano come se fossero stati #define d, vero?

Che cosa sia mai successo a un semplice:

#define BEGINNING_HEALTH 10

Amico, quelli erano i giorni.
Oh aspetta, quei sono ancora i giorni!

forse qualcosa sulla falsariga di una classe statica?

class CONSTANTS {
public:
static inline int getMana() { return 10;};
};

Come risposta rapida alla domanda del titolo, uno schema singleton è un possibile modo C ++ migliore per definire costanti tra file e assicurare solo un'istanza dell'oggetto.

Per quanto riguarda il problema dei parametri del modello, è necessario passare un tipo e non un valore. Il tuo tipo è " int " ;.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top