Referências e auto_ptr
Pergunta
Se eu tiver um auto_ptr posso passá-lo para uma referência como:?
auto_ptr<MyClass>Class(new MyClass);
void SetOponent(MyClass& oponent);
//So I pass SetOponent(Class)
E o que é um comportamento exemplar ímpar de auto_ptrs?
Solução
Não, você não pode, você teria que desreferenciava-lo:
SetOponent( * Class )
Como para o comportamento de copiar, eu recomendo que você leia um bom livro sobre C ++, como Effective C ++ por Scott Meyers. O comportamento copiando de auto_ptr é extremamente un-intuitivo e, possivelmente, para além do âmbito de uma resposta SO. No entanto, quem não arrisca ...
Quando um auto_ptr é copiado, a propriedade é transferida do original para a cópia. Por exemplo:
auto_ptr <Foo> p1( new Foo );
Neste ponto p1 possui o ponteiro para o objeto Foo.
auto_ptr <Foo> p2( p1 );
Após a cópia, p2 possui o ponteiro e p1 é alterado para que ele passou a deter um ponteiro NULL. Isto é importante, porque a cópia ocorre em muitos lugares em C ++. Você nunca deve, por exemplo, passar auto_ptrs por valor para funções, ou tentar armazená-los em recipientes de biblioteca padrão.
Outras dicas
O comportamento de cópia estranho é que você não pode fazer uma cópia e ainda ter o original. Use shared_ptr
(em boost :: ou std :: tr1: :) para isso. Isto significa que você não pode ter um recipiente STL de auto_ptrs
, entre outras coisas. auto_ptr<>
é muito útil para quando você vai ter uma cópia de um objeto, com um tempo de vida limitado. Se você copiar para outro auto_ptr<>
, você perde o primeiro. Se você passar os ponteiros, você tem uma excelente chance de tentar usar um objeto que já foi excluída.
Você pode chamar SetOponent(*Class);
se quiser, como que vai passar o item real (você passar objetos, não ponteiros, para referências). Se você passar para um ponteiro, você poderia chamar com SetOpponent(Class.get())
. Você ainda tem o problema que os MyClass serão eliminados quando classe sai do escopo.