Il modo migliore C ++ per definire le costanti tra file
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
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 " ;.