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?

Foi útil?

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.

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