Frage

Ich arbeite an einem Spiel und haben eine interessante Frage. Ich habe einige Spiel weite konstante Werte, die ich in einer Datei implementieren möchten. Im Moment habe ich so etwas wie folgt aus:

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;

Und dann Dateien nur #include "constants.hpp" Dies funktioniert großartig, bis ich brauchte eine der Konstanten als Template-Parameter zu verwenden, da extern verknüpfte Konstanten ungültig Template-Parameter sind. Also meine Frage ist, was ist der beste Weg, um diese Konstanten zu implementieren? Ich fürchte, dass einfach die Konstanten in einer Header-Datei setzen will sie in jeder Übersetzungseinheit definiert werden. Und ich will nicht Makros verwenden.

Danke

War es hilfreich?

Lösung

Sie sich von der extern los und Sie werden eingestellt.

Dieser Code funktioniert völlig in Ordnung in einem Header, weil alles, was „wirklich konstant“ ist und deshalb interne Bindung:

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

Dieser Code kann nicht sicher in einer Header-Datei gesetzt werden, da jede Zeile hat externe Bindung (entweder explizit oder wegen nicht wirklich konstant ist):

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

Andere Tipps

Wie wäre es Aufzählungen?

constants.hpp

  enum {
    BEGINNING_HEALTH = 10,
    BEGINNING_MANA = 5
  }

Verwenden Sie "static const int" in Ihrer .hpp-Datei, und legt nichts in der CPP-Datei (mit Ausnahme von was auch immer anderen Code haben Sie es natürlich).

Verwendung von Namensräumen machen:

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

dann kann u verwenden als player.health = GameBeginning :: HEALTH;

Die meisten Compiler einfach keine Einstufung der Platz für const POD Werte. Sie optimieren sie und behandeln sie, als ob sie #defined worden war, nicht wahr?

Was auch immer geschah mit einem einfachen:

#define BEGINNING_HEALTH 10

Man, das waren die Tage.
Oh, Moment mal, diejenigen noch sind die Tage!

vielleicht etwas entlang der Linien von einer statischen Klasse?

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

Als schnelle Antwort auf die Titelfrage, ein Singletonmuster ist eine mögliche beste, C ++ Art und Weise Quer Datei Konstanten zu definieren und sicherzustellen, nur eine Instanz des Objekts.

Was das Template-Parameter Problem, müssen Sie keinen Wert einen Typen zu übergeben. Ihre Art ist "int".

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top