Datei für Konstanten anlegen
-
Hallo,
für mein SFML Projekt brauche ich eine Header Datei, in welcher ich Konstanten, Farbdefinitionen usw speichern möchte, und auf welche alle anderen Dateien zugreifen können.
Das Beispiel#pragma once const float pi = 3.141592654f;
funktioniert, aber bei
sf::Color Plum(205, 120, 205);
gibt es Probleme, weil es offenbar mehrfach definiert wird. Mit dem static Keyword davor funktioniert es. Warum braucht pi kein static?
Static bedeutet, dass die Variable nur in der Datei sichtbar ist, in der sie definiert wurde. Wenn ich die Datei aber irgendwo includiere, ist die Variable ja auch dort sichtbar, wie bei jeder normalen Variable. Wo liegt also der Unterschied? Was verstehe ich falsch?
-
Warum ist pi
const
, Plum aber nicht? Könnte es vielleicht damit zusammenhängen?
-
@manni66 Ja stimmt Danke, dann funktioniert es. Nur warum? Das kann ich allerdings nur verwenden, wenn das Objekt nicht geändert wird, was allerdings bei z.B Font nicht der Fall ist, welche noch geladen und modifiziert werden muss.
-
@daniel sagte in Datei für Konstanten anlegen:
Das kann ich allerdings nur verwenden, wenn das Objekt nicht geändert wird,
Das ist das Wesen von Konstanten
was allerdings bei z.B Font nicht der Fall ist, welche noch geladen und modifiziert werden muss.
Das ist eine globale Variable, keine Konstante.
Ja stimmt Danke, dann funktioniert es. Nur warum?
Weil Konstanten internal linkage haben, Variablen dagegen external linkage.
-
probiers mal mit extern
-
@manni66 Das Problem ist nur, dass ich z.B sf::Font nicht als const deklarieren kann, weil es nunmal keine Konstante ist und noch verändert wird
-
@daniel wenn es keine konstante ist und jede datei darauf zugreifen soll, ist es übrigens eine globale variable und die sind meistens schlechter programmierstil.
-
@Wade1234 Es ist prinzipiell schon eine Konstante. Nur muss sie nach der Deklaration einmal geladen werden, aber sonst wird sie nicht verändert.
-
dann ist es trotzdem eine variable. warum erstellst du dir nicht eine struktur
struct MyConstants
und eine funktionInitializeConstants
, in der die variablen dann initialisiert werden, und übergibst dann überall eine konstante referenz auf diese struktur? das ist viel einfacher und schöner.
-
@Wade1234 sagte in Datei für Konstanten anlegen:
übergibst dann überall eine konstante referenz auf diese struktur
Wie soll ich das machen? Kannst du ein kleines Beispiel dafür zeigen?
-
struct MyConstants { int screenwidth; }; void InitializeConstants(struct MyConstants &myc) { myc.screenwidth = 1000; } void CalculateRectangleSize(int &rectanglesize, const struct MyConstants &myc) { rectanglesize = myc.screenwidth * 8 / 10; } int main() { struct MyConstants myc; InitializeConstants(myc); int rectanglesize; CalculateRectangleSize(rectanglesize, myc); return 0; }
-
@Wade1234 Vielen Dank. Warum benutzt du für MyConstants nicht den Standard Konstruktor? Und warum muss man eine Konstante Referenz übergeben? MyConstants soll ja seine eigene Datei haben, also muss es includiert werden. Dann braucht es den Struct als Übergabeparamter doch nicht mehr?
-
@Wade1234
InitializeConstants
- wofür gab es in C++ nochmal Konstruktoren?
-
@manni66 Zum initialisieren
-
@daniel sagte in Datei für Konstanten anlegen:
@Wade1234 Es ist prinzipiell schon eine Konstante. Nur muss sie nach der Deklaration einmal geladen werden, aber sonst wird sie nicht verändert.
Was bedeutet das konkret? Nach Programmstart werden einmal alle Fonts aus einem fest definierten Ordner eingelesen?
-
@manni66 Ja
-
@manni66 sagte in Datei für Konstanten anlegen:
@Wade1234
InitializeConstants
- wofür gab es in C++ nochmal Konstruktoren?ja da bin ich dann leider raus. ich weiß natürlich, dass es konstruktoren, inititialisierungslisten usw. gibt, aber da fehlte mir jetzt grad mal die fantasie für.
-
Gibt es auch eine Möglichkeit ohne die Struktur? Wie sähe das aus?
-
@daniel was hast du gegen die struktur? du kannst sie überall hinreichen, wo du sie brauchst. also ich weiß ja jetzt nicht, wie dein programm generell aussieht, aber wenn du jetzt ungefähr eine mio konstanten hast, die alle generell von überall lesbar sein müssen, dann bietet sich das doch so an.
wenn du natürlich hier mal eine konstante brauchst und dort eine andere, dann wäre das sicherlich nicht der richtige weg, weil man ja immer nur die daten zur verfügung stellen soll, die auch benötigt werden. dann solltest du dich vielleicht erstmal mit objektorientierter modellierung beschäftigen.
-