Question

Je travaille sur un jeu et j'ai une question intéressante. J'ai quelques valeurs constantes dans tout le jeu que je veux implémenter dans un seul fichier. En ce moment, j'ai quelque chose comme ça:

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;

Et ensuite, les fichiers ne contiennent que #include " constants.hpp " Cela fonctionnait très bien jusqu'à ce que je devais utiliser l'une des constantes comme paramètre de modèle, car les constantes liées en externe ne sont pas des paramètres de modèle valides. Ma question est donc la suivante: quel est le meilleur moyen de mettre en œuvre ces constantes? Je crains que le simple fait de placer les constantes dans un fichier d'en-tête ne les définisse dans chaque unité de traduction. Et je ne veux pas utiliser de macros.

Merci

Était-ce utile?

La solution

Éliminez le extern et vous êtes prêt.

Ce code fonctionne parfaitement dans un en-tête, car tout est "vraiment constant". et a donc un lien interne:

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

Ce code ne peut pas être placé en toute sécurité dans un fichier d'en-tête, car chaque ligne est associée à une liaison externe (soit explicitement, soit parce qu'elle n'est pas vraiment 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

Autres conseils

Qu'en est-il des enums?

constants.hpp

  enum {
    BEGINNING_HEALTH = 10,
    BEGINNING_MANA = 5
  }

Utilisez & static; static const int " dans votre fichier .hpp, et ne mettez rien dans le fichier .cpp (sauf le code que vous avez bien sûr).

utiliser les espaces de noms:

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

alors vous pouvez utiliser comme joueur.health = GameBeginning :: HEALTH;

La plupart des compilateurs n'allouent tout simplement pas d'espace pour les valeurs const POD. Ils les optimisent et les traitent comme si elles avaient été #define , n'est-ce pas?

Qu'est-il jamais arrivé à un simple:

#define BEGINNING_HEALTH 10

Homme, c'étaient les jours.
Oh, attendez, ces sont toujours les jours!

peut-être quelque chose comme une classe statique?

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

En guise de réponse rapide à la question du titre, un modèle singleton est une meilleure manière possible, en C ++, de définir des constantes inter-fichiers et d’assurer une seule instance de l’objet.

En ce qui concerne le problème du paramètre template, vous devez transmettre un type et non une valeur. Votre type est "int".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top