Datei für Konstanten anlegen
-
Tu mal das
static
wegtun tun. Oder schreib'constants::tiffanyBlue
.
-
@daniel das ist jetzt völlig sinnlos. Wenn du eine struct verwenden willst, musst du auch genau eine Instanz erzeugen und herumreichen. Der Konstruktor wird hier nie benutzt.
-
@Swordfish
Dann gibt es diesen Fehler:error: could not convert ‘mx::constants::tiffanyBlue’ from ‘const sf::Color(int)’ to ‘sf::Color’
Und unabhängig davon auch dieser:
error: expected identifier before numeric constant static sf::Color Plum(205, 120, 205);
-
@manni66 Aber bei einer statischen Member Variable brauche ich doch keine Instanz oder?
-
@daniel sagte in Datei für Konstanten anlegen:
@manni66 Aber bei einer statischen Member Variable brauche ich doch keine Instanz oder?
Du brauchst aber ohne Instanz auch keine struct, oder?
-
muss kann man statische variablen nicht außerhalb initialisieren? also warum machst du die überhaupt statisch?
-
@Wade1234 Damit ich keine Instanz brauche
-
@manni66 Kannst du das vieleicht kurz erklären? Ich verstehe das nicht ganz
-
@daniel sagte in Datei für Konstanten anlegen:
Und unabhängig davon auch dieser:
error: expected identifier before numeric constant static sf::Color Plum(205, 120, 205);
Herrgott.
struct bar_t { int a, b, c; bar_t(int a, int b, int c) : a{ a }, b{ b }, c{ c } {} }; struct foo { static bar_t const bar; }; bar_t const foo::bar = bar_t { 1, 2, 3 };
-
@daniel warum willst du keine instanz haben? sind das wieder irgendwelche bildungslücken von mir?
-
@Wade1234 Wenn das Ding nur statische member hat brauchts auch keine Instanz davon.
-
@Swordfish dein beispiel erklärt den sinn.
-
@Wade1234 Ja. Vielleicht sollte ich Informatik studieren damit ich das Kästchenmalen auch noch lerne. *scnr* *liebhab'*
-
@daniel sagte in Datei für Konstanten anlegen:
@manni66 Kannst du das vieleicht kurz erklären? Ich verstehe das nicht ganz
Was du jetzt hast ist dein ursprünglicher Ansatz mit struct drumrum. Welchen zusätzlichen Nutzen hat das struct?
-
@manni66 ich habe den Anfang vorher garnicht gelesen. Was ist überhaupt das problem?
-
@Swordfish Ich brauche nur eine Datei, in der ich Konstanten und Farbdefinitionen speichern kann, das sollten dann also Globale Konstanten sein. Ich weiß nur nicht wie ich das am besten und einfachsten mache
-
constants.h
#ifndef CONSTANTS_H_INCLUDED #define CONSTANTS_H_INCLUDED extern int constexpr my_constant; #endif /* CONSTANTS_H_INCLUDED */
constants.cpp
#include "constants.h" // eigentlich überflüssig. int constexpr my_constant = 42;
Eventuell die variablen noch in einen namespace stecken. Geschmackssache.
-
@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
-
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).