Pergunta
Eu tenho um ponteiro para uma QScriptEngine
que eu estou passando pelo construtor da classe sobrecarregado de Evaluator
eo atribui a QScriptEngine *engine_
classe (subclasses da classe Property
Evaluator
, e chama este construtor de Evaluator
, passando-o um QScriptEngine
já atribuídos). O construtor sem argumentos cria o novo ponteiro QScriptEngine
(subclasses da classe Generic
Evaluator
desta forma). No teste destructor I se engine_
não é NULL
, exclua o ponteiro, em seguida, atribuí-lo NULL
. Se o ponteiro (engine_
) na Property
derivado agora também ser NULL
? Algo me diz que este não é o caso. Se não, como você lida com esta situação? Preciso do QScriptEngine
ser a mesma instância por toda parte. de QScriptEngine
= operador é privado, ou eu estaria evitando o ponteiro todos juntos.
Eu vi algumas informações sobre ponteiros compartilhados (boost::shared_ptr
e std:tr1::shared_ptr
) em outra questão SO. Eu já estou usando o impulso para a biblioteca regex, de modo boost não é fora de questão se essa é a melhor maneira de lidar com isso. Esperemos que há um não-boost forma, para C ++ geral projetos de conhecimento e futuras.
Solução
Você pode resolver isso, dando uma das classes (classe A) controle de tempo de vida de que ponteiro, juntamente com um método 'getter'. A outra classe (classe B) sempre chamar getter de A sempre que necessário o ponteiro. Dessa forma, um permanece no controle do ponteiro em todos os momentos. Desvantagem é a função getter (ele provavelmente irá em linha, mas ainda é um segundo indirecta). Além disso, B vai ter que verificar esse ponteiro para NULL em praticamente cada utilização.
Sua outra opção é para embrulhar o ponteiro em algo como boost :: shared_ptr que cuida do problema (se usado corretamente) mantendo o ponteiro subjacente, e só excluí-lo quando todos os objetos que compartilham esse ponteiro são excluídos. Você poderia escrever isso mesmo, mas desde que você já tem impulso no jogo, eu tinha acabado de usar a sua implementação.
Uma terceira opção é a re-fator a coisa toda de modo que você não precisa de um ponteiro compartilhado. Eu, pessoalmente, nunca projetar um programa C ++ que precisava ponteiros compartilhados, só porque é um local onde os erros de gerenciamento de memória poderia facilmente fluência ao longo dos anos, mas isso é só comigo.