Datei für Konstanten anlegen
-
Wenn die Konstruktoren von dem font-dingsti für deine "Änderungswünsche" nicht ausreichen wirst du da wohl einfach pech haben.
-
@daniel sagte in Datei für Konstanten anlegen:
@Swordfish In etwa so war auch meine Ausgangssituation, nur mein Problem ist, dass ich sf::Font font noch in der nächsten Zeile verändern möchte. Und dann kann ich ja kein const benutzen. Es soll also Konstant sein, nachdem ich es kurz verändert habe
Derartige Probleme löse ich gerne auf diese Weise:
const sf::Font font = []{ sf::Font font; // verändere font ... return font; }();
Vorausgesetzt natürlich die Klasse ist bei klarem Verstand und lässt sowas mit sich machen. Die Methode ist auch nett für lokale
static
-Variablen.Mit C++17 kannst du deine nicht-
constexpr
-Konstanten auchinline
machen, dann sparst du dir die zusätzliche.cpp
-Datei. Dieconstexpr
-Variablen sollten implizitinline
sein und müssen eigentlich nicht in der.cpp
-Datei initialisiert werden.Zusatz: Für
pi
ist das hier noch eine schöne Initialisierung:const float pi = 4f * std::atan(1f); // oder allgemeiner (C++14) template <typename T> const T pi = T{4} * std::atan(T{1});
Das hat den Vorteil, dass man die hier automatisch die Genauigkeit der Hardware und des Typs verwendet und sich keinen Kopf darum machen muss, wie das Fließkomma-Literal jetzt konvertiert wird und wie viele Nachkommastellen man denn jetzt angeben sollte.
Schade nur, dass
std::atan
nichtconstexpr
ist, so muss man dann doch wieder das Fließkomma-Literal nehmen, wenn man den Wert in einemconstexpr
-Kontext benötigt (oder es wird wirklich unnötig kompliziert).
-
// ups. Nehme alles zurück. Verdammte Lambdas.
-
@daniel sagte in Datei für Konstanten anlegen:
@Swordfish In etwa so war auch meine Ausgangssituation, nur mein Problem ist, dass ich sf::Font font noch in der nächsten Zeile verändern möchte. Und dann kann ich ja kein const benutzen. Es soll also Konstant sein, nachdem ich es kurz verändert habe
Das Problem ist bereits gelöst, oder kannst du einen Grund nennen, warum du keine Funktion aufrufen kannst statt eine Konstante zu verwenden?
-
@Finnegan Super, Vielen Dank! Funktioniert genauso wie es soll. Das mit Pi werde ich machen
const sf::Font font = []{ ... }();
Kannst du vieleicht noch kurz erklären, was hier genau gemacht wird? Also warum die Eckigen Klammern davor und Runden Klammern danach?
@manni66
Ja, jetzt werden sie nur einmal geladen
-
@daniel sagte in Datei für Konstanten anlegen:
@Finnegan Super, Vielen Dank! Funktioniert genauso wie es soll.
Dann schau dir mal an, wie oft die Fonts jetzt geladen werden, wenn du den Header mehrfach verwendest.
-
@daniel sagte in Datei für Konstanten anlegen:
Kannst du vieleicht noch kurz erklären, was hier genau gemacht wird? Also warum die Eckigen Klammern davor und Runden Klammern danach?
-
Ein Font ist keine Konstante, sondern eine Ressource, und unterscheidet sich von ein paar vordefinierten Farben oder Zahlenwerten.
Dafür könntest Du einen "ResourceHolder" o. Ä. verwenden, welcher die Ressourcen (Fonts, Texturen, Sounds) lädt und Zugriff darauf bietet. Für ein Beispiel würde ich empfehlen:
https://github.com/SFML/SFML-Game-Development-Book/tree/master/02_Resources
Wenn Du jetzt nur ein einziges Font brauchst ist das vielleicht auch overkill. Aber ich rate davon ab Ressourcen mit Konstanten zu vermischen.
-
Also nach meinem Gefühl würde ich mir hier eine Ressource-Manager-Klasse bauen, oder eine in den Weiten des Internets finden und dann eine static-Instanz erzeugen. Scheiß auf Const.
-
@It0101 Also ein Meyers-singleton.
-
@It0101 sagte in Datei für Konstanten anlegen:
Scheiß auf Const.
EDIT: OK, im Kontext vermutlich gerechtfertigt. Trotzdem reisst es mich wenn ich sowas lese. /EDIT
-
@hustbaer sagte in Datei für Konstanten anlegen:
@It0101 sagte in Datei für Konstanten anlegen:
Scheiß auf Const.
Was ist denn jetzt der Vorteil einer Const-Variante, die es rechtfertigt 5 Tage darüber zu debattieren ( 5PT ?
)
-
@It0101 Ja in diesem Fall hast du wohl Recht mit dem was du sagen wolltest. Sorry. Mich hat's halt ein wenig gerissen auf grund der Formulierung.
ps: Hat
sf::Font
überhaupt mutable state?
-
@hustbaer sagte in Datei für Konstanten anlegen:
@It0101 Ja in diesem Fall hast du wohl Recht mit dem was du sagen wolltest. Sorry. Mich hat's halt ein wenig gerissen auf grund der Formulierung.
Ich bin auch ein "Const"-Freund und setze es überall ein, wo es möglich ist. const-correctness reduziert die Fehlerquote!
Aber in dem Fall ist aus meiner Sicht ein klassischer Ressource-Manager nicht unbedingt eine schlechte Idee