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

¿Fue útil?

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 " ;.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top