Konstanten

Schnelle objektorientierte, kompilierende Programmiersprache.
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Konstanten

Beitrag von Glocke » Fr Jan 18, 2013 9:16 am

Hi, über lang oder kurz braucht ja jeder einmal Konstanten :D
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

Benutzeravatar
Yoghurt
Beiträge: 79
Registriert: Fr Nov 16, 2012 8:01 am
Wohnort: Niederbayern

Re: Konstanten

Beitrag von Yoghurt » Fr Jan 18, 2013 9:30 am

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.
"Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why."

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Konstanten

Beitrag von cloidnerux » Fr Jan 18, 2013 10:18 am

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Konstanten

Beitrag von Glocke » Fr Jan 18, 2013 10:28 am

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 :lol:
Yoghurt hat geschrieben:Konstanten mit Hilfe des Präprozessors zu definieren machte man eigentlich nur in C
Oki doki :)

LG Glocke

Benutzeravatar
Yoghurt
Beiträge: 79
Registriert: Fr Nov 16, 2012 8:01 am
Wohnort: Niederbayern

Re: Konstanten

Beitrag von Yoghurt » Fr Jan 18, 2013 10:30 am

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. :P 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[]).
"Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why."

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Konstanten

Beitrag von Xin » Fr Jan 18, 2013 8:51 pm

Glocke hat geschrieben:Die Konstanten sind eh schon in einer Header-Datei, die im Grunde von allen anderen Teilen verwendet wird :lol:
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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Konstanten

Beitrag von nufan » Fr Jan 18, 2013 9:02 pm

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/" );
;)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Konstanten

Beitrag von Xin » Fr Jan 18, 2013 9:12 pm

dani93 hat geschrieben:;)
Verdammt... copy'n'paste...
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Yoghurt
Beiträge: 79
Registriert: Fr Nov 16, 2012 8:01 am
Wohnort: Niederbayern

Re: Konstanten

Beitrag von Yoghurt » Sa Jan 19, 2013 8:52 am

Da Xin und dani93 auch std::string verwenden (anstatt char[]) würde mich interessieren warum?
War mein "Tipp" nicht so gut?^^
"Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why."

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Konstanten

Beitrag von Glocke » Sa Jan 19, 2013 9:47 am

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

Antworten