C++ beste Weg, um zu definieren, cross-file-Konstanten
Ich arbeite an einem Spiel und habe eine interessante Frage. Ich habe einige Spiel-Breite Konstanten Werten, die ich umsetzen will, in eine Datei. Jetzt habe ich so etwas wie dieses:
constants.cpp
extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;
Konstanten.hpp
extern const int BEGINNING_HEALTH;
extern const int BEGINNING_MANA;
Und dann werden die Dateien nur #include "constants.hpp"
Das war großartig, bis ich brauchte, um eine der Konstanten, die als template-parameter, da der extern-verlinkten Konstanten sind nicht gültig template-Parameter.
Meine Frage ist also, was ist der beste Weg zur Umsetzung dieser Konstanten? Ich fürchte, dass das einfach, indem ich die Konstanten in einer header-Datei wird dazu führen, dass Sie definiert werden, in jeder übersetzungseinheit. Und ich will keine Makros verwenden.
Dank
InformationsquelleAutor rlbond | 2009-03-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Loszuwerden, die
extern
und Sie sind gesetzt.Dieser code funktioniert einwandfrei, in einem header, weil alles, was ist "wirklich" ständig " und hat daher interne Verlinkung:
Dieser code kann nicht sicher sein, setzen Sie sich in eine header-Datei, da jede Linie hat externe Bindung (entweder explizit oder weil der nicht wirklich Konstante):
Sie sind richtige, Feste. Danke.
Sie müssen "static", sonst erhalten Sie keine interne Verlinkung oder, im Idealfall, das äquivalent zu "#define" mit den Werten inline.
Buck Konstanten in C++ haben interne Verlinkung - keine Notwendigkeit für eine "statische"
InformationsquelleAutor Tom
Wie über enums?
Konstanten.hpp
InformationsquelleAutor Tommy Hui
Verwenden, "static const int" in Ihrem .hpp-Datei, und legen Sie nichts in die .cpp-Datei (außer, was andere code, den Sie haben, gibt es natürlich auch).
InformationsquelleAutor Jim Buck
machen Verwendung von namespaces:
dann u verwenden können, als Spieler.Gesundheit = GameBeginning::GESUNDHEIT;
InformationsquelleAutor user77682
Meisten Compiler einfach nicht Speicherplatz für const-POD-Werte. Optimieren Sie Sie und behandeln Sie, als seien Sie
#define
d, don ' T they?Dies gilt nur für ganzzahlige Konstanten. Schwimmer -, Doppel -, char*s, und andere Arten werden den zugewiesenen Speicher wenn die Optimierung deaktiviert ist.
Das ist nicht das, was ich meinte. Ich meinte für POD Konstanten, nicht Präprozessor majicks. Ich meinte in dem Sinne, dass das symbol und der Speicherplatz für den Wert nicht existieren, es sei denn, Sie versuchen, sich zu Ihrer Adresse.
Ich denke POD offiziell schließt die floats und doubles, aber floats und doubles sind in der Regel nicht auf diese Weise optimiert.
InformationsquelleAutor greyfade
Was ist eigentlich ein einfaches:
Mann, das waren noch Zeiten.
Oh wait, diese noch die Tage!
Einige von uns wie unsere Debugger, um zu zeigen, 'BEGINNING_HEALTH' anstelle von '10'.
<sarkastisch> Wenn Bedürfnisse Debugger, wenn du printf()? </sarkastisch>
printf, #define, wie es weiter geht. Das ist C++.
InformationsquelleAutor slacy
vielleicht etwas entlang der Linien von einer statischen Klasse?
constexpr
funktionieren soll. Außerdem werden C++ - namespaces, die superioer auf eine statische Klasse für die "Namensräume" - Konstanten.superior... ich fehlen grundlegende Fähigkeiten Korrekturlesen 🙂
InformationsquelleAutor MighMoS
Als schnelle Antwort auf die Frage des Titels, ein singleton-Muster ist eine bestmögliche, C++ Weg zu definieren, cross-file-Konstanten und versichern, nur eine Instanz des Objekts.
Soweit der Vorlage-parameter-problem, du musst ein Typ nicht Wert. Ihr Typ ist "int".
Warum auch nicht, ist sein problem zu lösen, mit template-Instanziierung, da wäre es nicht extern ist, wäre es ein lokales. Overkill ist relativ, was ist die Qualität, die Perspektive $100M $100K, $oder 100$, Spiel-budget?
jeffD, das problem ist, dass Ihre Antwort nicht sinnvoll. wollen Sie, um ein "int" ein singleton? ein int besteht durch Werte, nicht durch Identität. eine andere Sache, die wohl gemacht Menschen downvote Sie ist, dass Sie nicht wollen, um pass-a-Typ, sondern ein Wert zu seiner Vorlage. Warum sagen Sie er kann nicht?
Der Titel der Frage ist eine gute Frage von selbst. Vielleicht brauche ich wirklich, um zu sehen, mehr von seinem code. Siehe cplusplus.com/doc/tutorial/templates.html für eine ref. "Ein template-parameter ist eine spezielle Art der parameter, die übergeben werden können, einen Typ als argument". Wünsche, Kommentare, hyperlinks erlaubt.
Schön, die http-Adresse wird automatisch hyperized.
InformationsquelleAutor jeffD