Domanda

Sto scrivendo una lib e un progetto demo. Al progetto non importa quale versione della lib usi (posso usare sdl, directx o qualunque cosa mi piaccia come backend gfx). Per ottenere l'oggetto che faccio

Obj *obj = libname_newDevice();

Ora, dovrei usare delete o dovrei fare obj- > deleteMe (); ? Lo chiedo perché non sto facendo esattamente le novità quindi non dovrei fare l'eliminazione?

Ho obj- > create (theType); che restituisce una classe con l'interfaccia Obj. La mia vera domanda è: ho bisogno di libname_deleteDevice (); o obj- > deleteMe () va bene dato che ho un deleteMe nell'interfaccia?

È stato utile?

Soluzione

Vorrei fare un ulteriore passo.
Se si utilizza una funzione di fabbrica per creare, potrebbe essere logico utilizzare una funzione di fabbrica per distruggere. Inoltre, per rendere tutto piacevole e sicuro, avvolgerlo in un oggetto.

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.

Altri suggerimenti

Dato che stai astrattando la creazione in libname_newDevice () (che devo dire non è un buon approccio), dovresti distruggere usando qualcosa come libname_destroyDevice (obj) .

E come suggerisce il commento di Martin, è meglio metterli nel costruttore e nel distruttore di una classe personalizzata, che devi solo creare in pila, e il compilatore si occuperà del resto.

Prova a chiarire la tua domanda. Per me non è del tutto chiaro.

  • Perché parli di un back-end grafico? È pertinente alla domanda?
  • Stai chiedendo come dovresti progettare la tua biblioteca o come dovresti usarla?

È buona norma avere una factory di oggetti per creare l'oggetto. Presumo che questo sia il ruolo di libname_newDevice () .

La libreria dovrebbe anche fornire un modo per eliminare l'oggetto (come obj- > DeleteMe () o libname_Delete (obj) ).

Non fare affidamento sul delete di C ++: il chiamante e la libreria potrebbero essere stati compilati con versioni diverse del compilatore, il che farebbe cose diverse per quanto riguarda l'allocazione di risorse e memoria. È quindi più sicuro se la tua lib cancella l'oggetto che ha creato.

Penso che il modo migliore sarebbe onorare RAII e avere qualche oggetto wrapper per il conteggio dei riferimenti (puoi persino usare shared_ptr con un deallocatore personalizzato ).

Sicuramente non vuoi implementare Obj :: deleteMe (). Dovrebbe fare qualcosa del tipo:

delete this;

mentre eri ancora dentro questo- > deleteMe (). Segui il suggerimento di Jaywalker e fai in modo che la funzione di distruzione prenda un Obj * come parametro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top