Pergunta

Eu estou escrevendo um lib e um projeto de demonstração. O projeto não se importa qual versão do uso lib I (eu posso usar SDL, DirectX ou o que gosto como o backend gfx). Para obter o objeto que faço

Obj *obj = libname_newDevice();

Agora, devo usar excluir ou devo fazer obj->deleteMe();? Eu pergunto porque eu não estou fazendo exatamente nova, então eu não deveria estar fazendo a exclusão?

Eu tenho obj->create(theType); que retorna uma classe com a interface Obj. Minha verdadeira questão é que eu preciso de um libname_deleteDevice(); ou é obj->deleteMe() muito bem desde que eu tenho um deleteMe na interface?

Foi útil?

Solução

Gostaria de ter um pouco mais longe.
Se você estiver usando uma função de fábrica para criar, pode ser lógico usar uma função de fábrica para destruir. Além desse para fazer tudo agradável e exetion envoltório seguro em em um objeto.

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.

Outras dicas

Uma vez que você está abstraindo a criação dentro libname_newDevice() (que eu tenho que dizer que não é uma boa abordagem), você deve destruir usando algo como libname_destroyDevice (obj).

E, como o comentário de Martin sugere, é melhor colocá-los no construtor e destruidor de uma classe personalizada, que você só precisa criar na pilha, eo compilador vai cuidar do resto.

Por favor, tente esclarecer a sua pergunta. É totalmente claro para mim.

  • Por que você fala de um back-end gráfico? É relevante para a questão?
  • Você está perguntando como você deve projetar sua biblioteca ou como você deve usá-lo?

É uma boa prática para ter uma fábrica de objeto para criar o objeto. Eu suponho que este é o papel do libname_newDevice().

A biblioteca também deve fornecer uma maneira para excluir o objeto (como obj->DeleteMe() ou libname_Delete(obj)).

Não confie em 's C ++ delete: chamador e uma biblioteca pode ter sido compilado com versão diferente do compilador, que faria as coisas diferentes a respeito de alocação de memória e recursos. É, portanto, mais seguro se o seu lib exclui o objeto que criou.

Eu acho que a melhor maneira seria para honrar RAII e ter algum objeto wrapper contagem de referência (você ainda pode usar shared_ptr com um desalocador personalizado ).

Você definitivamente não quer implementar Obj :: deleteMe (). Teria de fazer algo como:

delete this;

enquanto você ainda estavam dentro this-> deleteMe (). sugestão e de acompanhamento Jaywalker fazer a função de destruir tomar uma Obj * como um parâmetro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top