C ++ es la mejor manera de definir constantes entre archivos
Pregunta
Estoy trabajando en un juego y tengo una pregunta interesante. Tengo algunos valores constantes de todo el juego que quiero implementar en un archivo. En este momento tengo algo como esto:
constants.cpp
extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;
constantes.hpp
extern const int BEGINNING_HEALTH;
extern const int BEGINNING_MANA;
Y luego los archivos solo #incluyen " constants.hpp " Esto funcionaba muy bien, hasta que necesitaba usar una de las constantes como parámetro de plantilla, porque las constantes vinculadas externamente no son parámetros de plantilla válidos. Entonces mi pregunta es, ¿cuál es la mejor manera de implementar estas constantes? Me temo que simplemente poner las constantes en un archivo de encabezado hará que se definan en cada unidad de traducción. Y no quiero usar macros.
Gracias
Solución
Deshágase del extern
y estará listo.
Este código funciona perfectamente bien en un encabezado, porque todo es "realmente constante" y por lo tanto tiene enlace interno:
const int BEGINNING_HEALTH = 10;
const int BEGINNING_MANA = 5;
const char BEGINNING_NAME[] = "Fred";
const char *const BEGINNING_NAME2 = "Barney";
Este código no se puede poner de forma segura en un archivo de encabezado porque cada línea tiene un enlace externo (ya sea explícitamente o por no ser realmente constante):
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
Otros consejos
¿Qué tal las enumeraciones?
constantes.hpp
enum {
BEGINNING_HEALTH = 10,
BEGINNING_MANA = 5
}
Utilice " static const int " en su archivo .hpp, y no coloque nada en el archivo .cpp (excepto cualquier otro código que tenga, por supuesto).
utilice espacios de nombres:
namespace GameBeginning {
const int HEALTH = 10;
const int MANA = 5;
};
entonces puedes usar como player.health = GameBeginning :: HEALTH;
La mayoría de los compiladores simplemente no asignan espacio para valores const POD. Los optimizan y los tratan como si hubieran sido #define
d, ¿no?
Lo que le pasó a un simple:
#define BEGINNING_HEALTH 10
Hombre, esos eran los días.
¡Oh, espera, esos todavía son los días!
¿acaso algo similar a una clase estática?
class CONSTANTS {
public:
static inline int getMana() { return 10;};
};
Como respuesta rápida a la pregunta del título, un patrón singleton es una mejor forma posible de C ++ para definir constantes entre archivos y asegurar solo una instancia del objeto.
En cuanto al problema del parámetro de plantilla, debe pasar un tipo, no un valor. Su tipo es " int " ;.