Question

Si j'ai un auto_ptr, puis-je le passer pour référence? Comme:

auto_ptr<MyClass>Class(new MyClass);
void SetOponent(MyClass& oponent);
//So I pass SetOponent(Class)

Et quel est le comportement de copie impair de auto_ptrs?

Était-ce utile?

La solution

Non, vous ne pouvez pas, vous devez le déréférencer:

SetOponent( * Class )

En ce qui concerne le comportement de copie, je vous recommande de lire un bon livre sur C ++, tel que Effective C ++ de Scott Meyers. Le comportement de copie de auto_ptr est extrêmement non intuitif et dépasse peut-être le cadre d'une réponse SO. Cependant, rien ne risquait ...

Lorsqu'un auto_ptr est copié, la propriété est transférée de l'original à la copie. Par exemple:

auto_ptr <Foo> p1( new Foo ); 

à ce stade, p1 est propriétaire du pointeur sur l'objet Foo.

auto_ptr <Foo> p2( p1 ); 

Après la copie, p2 est propriétaire du pointeur et p1 est modifié afin qu'il contienne maintenant un pointeur NULL. Ceci est important car la copie se produit à de nombreux endroits en C ++. Par exemple, vous ne devez jamais transmettre auto_ptrs par valeur à des fonctions, ni tenter de les stocker dans des conteneurs de bibliothèque standard.

Autres conseils

Le comportement de copie inhabituel est que vous ne pouvez pas effectuer de copie et conservez l’original. Utilisez shared_ptr (dans boost :: ou std :: tr1: :) pour cela. Cela signifie que vous ne pouvez pas avoir un conteneur STL de auto_ptrs, entre autres. auto_ptr<> est très utile lorsque vous aurez une copie d’un objet avec une durée de vie limitée. Si vous copiez sur un autre SetOponent(*Class);, vous perdez le premier. Si vous passez les pointeurs, vous avez une excellente chance d’utiliser un objet qui a déjà été supprimé.

Vous pouvez appeler SetOpponent(Class.get()) si vous le souhaitez, car cela transmettra l'élément réel (vous transmettez des objets, et non des pointeurs, à des références). Si vous passez à un pointeur, vous pouvez appeler avec <=>. Vous aurez toujours le problème que la MyClass sera supprimée lorsque Class sera hors de portée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top