Wrapper: Frage nach Design
-
Hallo,
ich bastle nun schon einige Zeit an einer "Engine" (falls man das so nennen kann), die auf SDL basiert.Nun möchte ich eine Surface-Klasse erstellen, die ich z.B. an ein Drawing-Objekt übergebe:
Drawing g(myScreen); g.FillRect(0, 0, 20, 20);
Ich habe jetzt ein paar Fragen zum Design. Ich wollte es erst so machen, dass ich drei Konstruktoren habe:
// erstellt eine Kopie vom Surface und speichert diese in Surface ab, wenn wrap == false, sonst speichert er nur den Ptr. auf den Screen Surface(SDL_Surface *sdlSurface, bool wrap); // erstellt eine Kopie des Surfaces (also des "echten" Surfaces) Surface(const Surface &surface); // erstellt ein neues Surface mit Breite & Höhe Surface(int width, int height); ~Surface() { if (!this->_wrap) SDL_FreeSurface(this->_surface); }
Dabei haben sich viele, mir logisch erscheinende Probleme aufgetan:
1.) Es erscheint mir kontraproduktiv eine Klasse zu haben, die entweder Kopieen erstellt oder nur den Zugriff auf eine bereits vorhandene Oberfläche zu erlaubt
2.) Was ist, wenn ich sich ein Surface-Objekt löscht und das eigentliche SDL-Surface auch löscht? Ein anderes Surface-Objekt könnte ja noch darauf zeigen
3.) Sehr verwirrendHabt ihr ein paar Vorschläge wie ich das besser gestalten kann?
Und was haltet ihr generell von Operatorüberladung (in diesem Falle operator=) bei so etwas?Gruß & Danke
-
Wenn es ein Wrapper sein soll, warum kommt der Benutzer dann überhaupt noch mit
SDL_Surface
in Kontakt? Ich würde eine RAII-Klasse schreiben, die intern automatischSDL_Surface
-Objekte anlegt und zerstört. Kopierbar würde ich sie eher nicht machen, oder macht die Kopie einer Oberfläche (z.B. eines Fensters) immer Sinn?operator=
ist in den allermeisten Fällen genau dann sinnvoll, wenn ein Kopierkonstruktor angebracht ist. Aber wie gesagt halte ich hier Kopierbarkeit nicht für besonders klug, daher könntest du Kopierkonstruktor und Zuweisungsoperator privat machen und nicht implementieren.Übrigens gibt es schon Wrapper um SDL. Oder auch eigenständige Bibliotheken für C++ wie z.B. SFML.
-
Hi, danke.
Ja, ich weiß, dass es bereits Wrapper gibt - möchte es aber gerne nach meinen eigenen Vorstellungen umsetzenWenn ich den Kopierkonstruktor
private
mache, kann ich den dann noch viaDrawing(const Surface &surface);
übergeben?
Und was passiert, wenn ein Surface-Objekt Teil einer Klasse ist, die kopierbar ist, und das Objekt der Klasse kopiert wird. Meckert der Compiler dann?
Gruß