Seite 1 von 2
Konstanten
Verfasst: Fr Jan 18, 2013 9:16 am
von Glocke
Hi, über lang oder kurz braucht ja jeder einmal Konstanten
Ich brauch sie z.B. um Dateipfade zur Compilerzeit festzulegen, z.B. "data/map/xy.dat". Dabei verwende ich einen
const std::string DATA = "data/" sowie
const std::string MAP = "map/" und bastel mir dann den (zur Anwendung relativen) Pfad
std::string path = DATA + MAP + "xy.dat" zusammen.
Wie und wo deklariere und initialisere ich meine Konstanten? Bisher habe ich in der Header-Datei mittels
Code: Alles auswählen
extern const std::string DATA, FONTS, SFX, ENTITY, MUSIC, MAP, TILES;
die Variablen deklariert und in der Quellcodedatei mittels
Code: Alles auswählen
const std::string DATA = "data/";
const std::string FONTS = "fonts/";
const std::string SFX = "sfx/";
const std::string ENTITY = "entity/";
const std::string MUSIC = "music/";
const std::string MAP = "map/";
const std::string TILES = "tiles/
initialisiert. Ist das so die gängige Praxis?
Und was mache ich mit Integer-Konstanten: genauso oder mittels
#define zahl 1
LG Glocke
Re: Konstanten
Verfasst: Fr Jan 18, 2013 9:30 am
von Yoghurt
Glocke hat geschrieben:Hi, über lang oder kurz braucht ja jeder einmal Konstanten
Ich brauch sie z.B. um Dateipfade zur Compilerzeit festzulegen, z.B. "data/map/xy.dat". Dabei verwende ich einen const std::string DATA = "data/" sowie const std::string MAP = "map/" und bastel mir dann den (zur Anwendung relativen) Pfad std::string path = DATA + MAP + "xy.dat" zusammen.
Hallo

warum nimmst du hier kein char[]?
Mit std::string hast du einen Overhead den du ja eigentlich nicht brauchst.
Glocke hat geschrieben:Wie und wo deklariere und initialisere ich meine Konstanten? Bisher habe ich in der Header-Datei mittels
Code: Alles auswählen
extern const std::string DATA, FONTS, SFX, ENTITY, MUSIC, MAP, TILES;
die Variablen deklariert und in der Quellcodedatei mittels
Code: Alles auswählen
const std::string DATA = "data/";
const std::string FONTS = "fonts/";
const std::string SFX = "sfx/";
const std::string ENTITY = "entity/";
const std::string MUSIC = "music/";
const std::string MAP = "map/";
const std::string TILES = "tiles/
initialisiert. Ist das so die gängige Praxis?
Also wenn es globale Konstanten sind oder welche die du weitergeben willst (wie zum Beispiel bei SDL: SDL_INIT_VIDEO) dann würde ich das in einen Header packen.
Die Dateipfade brauchst du ja wahrscheinlich nur an einer Stelle. Somit könntest du die Konstanten auch nur da deklarieren und initialisieren.
Wenn du allerdings viele verschieden Pfade hast (Map, Sound, Grafiken, Config-Dateien, usw.) dann würde es vielleicht doch Sinn machen, alle in einer Datei zu definieren. Wegen Übersichtlichkeit und so.
Aber ansonsten würde ich das auch so machen wie du.
Glocke hat geschrieben:Und was mache ich mit Integer-Konstanten: genauso oder mittels #define zahl 1
Konstanten mit Hilfe des Präprozessors zu definieren machte man eigentlich nur in C (weil es einfach keine andere Möglichkeit gab), wobei es im neuen C-Standard auch const gibt, oder?
In C++ würde ich das aber nicht machen.
Re: Konstanten
Verfasst: Fr Jan 18, 2013 10:18 am
von cloidnerux
Wie und wo deklariere und initialisere ich meine Konstanten?
Da wo du sie brauchst. Brauchst du Konstanten nur in einer Funktion, dann solltest du sie nur in der Datei Deklarieren oder als Parameter übergeben. Brauchst du es in vielen Dateien, in einer Headerdatei.
Wobei man auch darüber nachdenken kann, bestimmte Pfade in einer externen Datei abzulegen, die man dann ausliest, sodass du einen Einfluss darauf nehmen kannst.
Konstanten mit Hilfe des Präprozessors zu definieren machte man eigentlich nur in C (weil es einfach keine andere Möglichkeit gab), wobei es im neuen C-Standard auch const gibt, oder?
Soweit ich das weiß, kann C99 const.
"Konstanten" über den Präprozessor sind egt keine Konstanten, sondern normale Zahlen die vom Compiler anders behandelt werden. Mitunter kann eine per #define bereitgestellte Zahl besser Optimiert werden als eine Konstante über eine const Deklarierte Variable.
Aber bei einer const-Deklarierten Variable hast du Typsicherheit, da dein Compiler prüft, ob die Typen stimmen.
Re: Konstanten
Verfasst: Fr Jan 18, 2013 10:28 am
von Glocke
Yoghurt hat geschrieben:warum nimmst du hier kein char[]?
Wie verknüpfe ich mehrere char-Arrays miteinander zu einem std::string?
Yoghurt hat geschrieben:Also wenn es globale Konstanten sind [...] dann würde ich das in einen Header packen.
Die Dateipfade brauchst du ja wahrscheinlich nur an einer Stelle. Somit könntest du die Konstanten auch nur da deklarieren und initialisieren.
Yoghurt hat geschrieben:Wenn du allerdings viele verschieden Pfade hast (Map, Sound, Grafiken, Config-Dateien, usw.) dann würde es vielleicht doch Sinn machen, alle in einer Datei zu definieren. Wegen Übersichtlichkeit und so.
Aber ansonsten würde ich das auch so machen wie du.
Die Konstanten sind eh schon in einer Header-Datei, die im Grunde von allen anderen Teilen verwendet wird
Yoghurt hat geschrieben:Konstanten mit Hilfe des Präprozessors zu definieren machte man eigentlich nur in C
Oki doki
LG Glocke
Re: Konstanten
Verfasst: Fr Jan 18, 2013 10:30 am
von Yoghurt
cloidnerux hat geschrieben:Soweit ich das weiß, kann C99 const.
"Konstanten" über den Präprozessor sind egt keine Konstanten, sondern normale Zahlen
1 ist auch eine Konstante. Sie wird immer 1 sein.

Daher sind "normale" Zahlen (Literale) auch Konstanten.
cloidnerux hat geschrieben:die vom Compiler anders behandelt werden.
Diese Zahlen werden vom Compiler auch nicht anders behandelt. Der Compiler sieht das #define eigentlich gar nicht mehr, weil das nur Anweisungen für den Präprozessor sind. Dieser ersetzt einfach alle Vorkommen von "zahl" durch 1 (bei "#define zahl 1"). Erst dann kommt der Quellcode zum Compiler.
cloidnerux hat geschrieben:Mitunter kann eine per #define bereitgestellte Zahl besser Optimiert werden als eine Konstante über eine const Deklarierte Variable.
Warum? Ich nehme an, dass der Compiler in irgendeinem Optimierungsschritt die Konstanten (const) sowieso durch Literale ersetzt (zumindest bei int Konstanten), oder?
cloidnerux hat geschrieben:Aber bei einer const-Deklarierten Variable hast du Typsicherheit, da dein Compiler prüft, ob die Typen stimmen.
Das wäre für mich Grund genug const zu verwenden.
Glocke hat geschrieben:Wie verknüpfe ich mehrere char-Arrays miteinander zu einem std::string?
Ein char-Array ist ja eigentlich schon ein (C-)String.

Edit: Ich vermute du kannst einfach die die Datentypen austauschen (std::string <> char[]).
Re: Konstanten
Verfasst: Fr Jan 18, 2013 8:51 pm
von Xin
Glocke hat geschrieben:Die Konstanten sind eh schon in einer Header-Datei, die im Grunde von allen anderen Teilen verwendet wird
Meine Herangehensweise:
Headerdatei:
Code: Alles auswählen
class Path
{
static std::string const Data;
static std::string const Fonts;
};
Implementation:
Code: Alles auswählen
std::string const Path::Installation( "installation/" );
std::string const Path::Data( "data/" );
std::string const Path::Fonts( "fonts/" );
Benutzung:
Code: Alles auswählen
std::string datapath = Path::Installation + Path::Data;
Edit by Xin: korrigiert, wie dani93 richtig gesagt hat.
Re: Konstanten
Verfasst: Fr Jan 18, 2013 9:02 pm
von nufan
Xin hat geschrieben:Implementation:
Code: Alles auswählen
std::string const Installation( "installation/" );
std::string const Data( "data/" );
std::string const Fonts( "fonts/" );
Code: Alles auswählen
std::string const Path::Installation( "installation/" );
std::string const Path::Data( "data/" );
std::string const Path::Fonts( "fonts/" );

Re: Konstanten
Verfasst: Fr Jan 18, 2013 9:12 pm
von Xin
dani93 hat geschrieben:
Verdammt... copy'n'paste...
Re: Konstanten
Verfasst: Sa Jan 19, 2013 8:52 am
von Yoghurt
Da Xin und dani93 auch std::string verwenden (anstatt char[]) würde mich interessieren warum?
War mein "Tipp" nicht so gut?^^
Re: Konstanten
Verfasst: Sa Jan 19, 2013 9:47 am
von Glocke
Xin hat geschrieben:Headerdatei:
Code: Alles auswählen
class Path
{
static std::string const Data;
static std::string const Fonts;
};
Implementation:
Code: Alles auswählen
std::string const Path::Installation( "installation/" );
std::string const Path::Data( "data/" );
std::string const Path::Fonts( "fonts/" );
Benutzung:
Code: Alles auswählen
std::string datapath = Path::Installation + Path::Data;
Gefällt mir sehr gut
LG Glocke