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 verwirrend

    Habt 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 automatisch SDL_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 umsetzen 😉

    Wenn ich den Kopierkonstruktor private mache, kann ich den dann noch via

    Drawing(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ß


Log in to reply