Frage

Wenn ich einen auto_ptr habe ich es für einen Verweis übergeben kann wie:

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

Und was ist ungeradee Kopie Verhalten von auto_ptrs?

War es hilfreich?

Lösung

Nein, Sie können nicht, würden Sie zu dereferenzieren haben:

SetOponent( * Class )

Was das Kopierverhalten, empfehle ich Ihnen, lesen Sie ein gutes Buch über C ++, wie Effective C ++ von Scott Meyers. Das Kopierverhalten von auto_ptr ist extrem un-intuitives und möglicherweise darüber hinaus der Umfang einer SO beantworten. Aber wer nicht wagt ...

Wenn ein auto_ptr kopiert wird, das Eigentum wird von dem Original auf die Kopie übertragen. Zum Beispiel:

auto_ptr <Foo> p1( new Foo ); 

An diesem Punkt p1 besitzt den Zeiger auf das Foo-Objekt.

auto_ptr <Foo> p2( p1 ); 

Nach der Kopie, p2 besitzt den Zeiger und p1 geändert , so dass es jetzt einen NULL-Zeiger hält. Dies ist wichtig, weil das Kopieren in vielen Orten in C ++ auftritt. Sie sollten sich nicht zum Beispiel passieren auto_ptrs von Wert zu Funktionen oder versuchen, sie in Standardbibliothek Container zu speichern.

Andere Tipps

Das ungeradee Kopie Verhalten ist, dass Sie nicht eine Kopie machen können und haben immer noch das Original. Verwenden Sie shared_ptr (in boost :: oder std :: tr1: :) dafür. Dies bedeutet, dass Sie nicht einen STL-Container von auto_ptrs, unter anderem haben können. auto_ptr<> ist sehr nützlich, wenn Sie eine Kopie eines Objekts, mit einer begrenzten Lebensdauer haben werden. Wenn Sie in einer anderen auto_ptr<> kopieren, verlieren Sie die erste. Wenn Sie die Zeiger umkippen, haben Sie eine gute Chance, zu versuchen, ein Objekt zu verwenden, das bereits gelöscht.

Sie können SetOponent(*Class); nennen, wenn man so will, als dass der eigentlichen Punkt passieren (Sie passieren Objekte, keine Zeiger, zu Referenzen). Wenn Sie auf einen Zeiger übergeben, können Sie mit SetOpponent(Class.get()) nennen. Sie werden immer noch das Problem, dass die MyClass werden gelöscht, wenn Klasse den Gültigkeitsbereich verlässt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top