Frage

Ich schreibe eine lib und ein Demo-Projekt. Das Projekt kümmert sich nicht, welche Version des lib Ich benutze (ich kann sdl, directx oder was auch immer Ich mag als das GFX-Backend verwenden). Um das Objekt, das ich tun

Obj *obj = libname_newDevice();

Nun soll ich löschen verwenden oder soll ich obj->deleteMe(); tun? Ich frage, weil ich nicht genau das, neu, so sollte ich nicht tun die löschen?

Ich habe obj->create(theType);, die eine Klasse mit dem Obj-Schnittstelle zurückgibt. Meine eigentliche Frage ist, brauche ich einen libname_deleteDevice(); oder ist obj->deleteMe() in Ordnung, da ich eine DeleteMe in der Schnittstelle haben?

War es hilfreich?

Lösung

Ich würde einen Schritt weiter.
Wenn Sie eine Fabrik-Funktion zu erstellen, verwenden, kann es sinnvoll sein, eine Fabrik-Funktion zu verwenden, um zu zerstören. Zusätzlich dazu alles schön und exetion sicher einpacken zu machen in in einem Objekt.

class ObjWrap
{
    public:
        ObjWrap()
            :obj(libname_newDevice())
        {}
        ~ObjWrap()
        {    libname_deleteDevice(obj);}
    private:
        ObjWrap(ObjWrap const&);        // Dont copy
        void operator=(ObjWrap const&); // Dont copy
        Obj* obj;
}; // If you want to copy then you need to extra work on ref counting
   // This may need some form of smart pointer.

Andere Tipps

Da Sie die Erstellung innerhalb libname_newDevice() sind abstrahiert (was ich zu sagen habe ist kein guter Ansatz), sollten Sie mit so etwas wie libname_destroyDevice (obj) zerstören.

Und wie der Kommentar von Martin schon sagt, ist es am besten, sie im Konstruktor und Destruktor einer benutzerdefinierten Klasse setzen, dass Sie nur auf Stapel erstellen müssen, und der Compiler wird der Rest kümmern.

Bitte versuchen Sie Ihre Frage zu klären. Es ist völlig unklar, zu mir.

  • Warum sprechen Sie von einer grafischen Backend? Ist es für die Frage?
  • Sind Sie fragen, wie Sie Ihre Bibliothek entwerfen sollte, oder wie Sie es verwenden sollte?

Es ist eine gute Übung, ein Objekt Fabrik zu haben, das Objekt zu erstellen. Ich nehme an, dies die Rolle der libname_newDevice() ist.

Die Bibliothek sollte auch eine Möglichkeit bieten, das Objekt (wie obj->DeleteMe() oder libname_Delete(obj)).

löschen

Verlassen Sie sich nicht auf C ++ 's delete: Anrufer und Bibliothek kann mit verschiedener Version des Compilers kompiliert wurde, die verschiedene Dinge tun würde, Speicher und Ressourcenzuweisung in Bezug auf. Es ist daher sicherer, wenn Ihr lib löscht das Objekt, um es erstellt.

Ich denke, der beste Weg, RAII und haben einige Referenzzählung Wrapper-Objekt zu ehren wäre (Sie können sogar verwenden shared_ptr mit einem benutzerdefinierten deallocator ).

Sie definitiv nicht wollen, Obj :: DeleteMe () implementieren. Es wäre so etwas wie zu tun hat:

delete this;

, während Sie noch im Inneren waren this-> DeleteMe (). Folgen Sie Jaywalker Vorschlag und machen die zerstören Funktion ein Obj * als Parameter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top