Vordefinierte Farben/Objekte
-
Ich würde gerne vordefinierte Farben in meine Color-Klasse "einbauen". Aus Java kenne ich dies als:
// [...] public static final Color RED = new Color(255, 0, 0, 255); // [...]In C++ habe ich es folgendermaßen probiert:
// [...] namespace FormGraphics { class Color { public: // [...] constexpr static Color *BLACK = new Color(0, 0, 0, 0); constexpr static Color *BLUE; // [...] private: // [...] }; } // [...]Damit kriege ich aber folgenden Fehler:
../src/Color.h:37:54: error: invalid use of incomplete type ‘class FormGraphics::Color’ constexpr static Color *BLACK = new Color(0, 0, 0, 0);Wenn mir jemand dabei weiterhelfen könnte wäre ich sehr dankbar

-
Erstmal: Lass den Java-Style sein:
Class * obj = new Class(...); // Java-Style // in C++ ist das Class obj(...);Und dann gibt es mehrere Möglichkeiten. Eine einfache, aber eventuell nicht so schöne Lösung wäre die Farben in ein Enum zu quetschen:
enum Colors { Black = 0x000000, Red = 0xff0000, Green = 0x00ff00, Blue = 0x0000ff, White = 0xffffff };Auf deine Art machst dus so:
// Color.h class Color { public: Color(int r, int g, int b); public: static const Color RED; // ... }; // Color.cpp const Color Color::RED(255, 0, 0); // ...
-
final in Java ist übrigens (afaik) nicht C++11 constexpr.
constexpr bedeutet das der Ausdruck ein konstanter Ausdruck ist (duh),
d.h. dass er zur compile time ausgewertet werden kann.
Um UDTs wie Color constexpr zu machen müssen sie literale Typen sein, d.h. constexpr Konstruktor, etc.
Alles relativ kompliziert. Und mit new geht das gar nicht.
Ich empfehle dir aber ein gutes C++ Grundlagenbuch zu lesen, bevor du in C++ programmierst.
C++ hat echt andere Konzepte als Java, insbesondere was Resourcenverwaltung angeht.
Die sollte man schon können.
-
Es bietet sich an, die Konstanten außerhalb der Klasse zu definieren, da du sie nur so constexpr bekommen dürftest, was bei einer Color-Klasse wünschenswert ist.
static constexpr Color ColorBlack(0,0,0); static constexpr Color ColorWhite(255,255,255); [...]Und wurde ja schon gesagt, aber wenn du in C++ meinst, new brauchen zu müssen, dann solltest du als Reaktion immer sofort auf einem Forum fragen, was du falsch gemacht hast. Seit C++11 ist new dank Move-Konzept weitgehend überflüssig geworden.
-
Seit C++11 ist new dank Move-Konzept weitgehend überflüssig geworden.
newhat mit Move-Semantiks genau gar nichts zu tun. Meinst du eher Smart-Pointer undmake_unique?@Nathan: Kompliziert nicht gerade:
struct Color { std::uint8_t r, g, b; }; static constexpr Color Red{0xff, 0, 0};
-
Arcoth schrieb:
struct Color { std::uint8_t r, g, b; };Warum mit
std::unit8_tplattformabhängigkeit einhandeln?
-
Arcoth schrieb:
@Nathan: Kompliziert nicht gerade:
struct Color { std::uint8_t r, g, b; }; static constexpr Color Red{0xff, 0, 0};Ich sprach im allgemeinem.
Von Klassen, die auch was tun.