1

auto_ptr がある場合は、参照用に渡すことができますか?のように:

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

また、auto_ptrs の奇妙なコピー動作とは何ですか?

4

2 に答える 2

4

いいえ、できません。逆参照する必要があります。

SetOponent( * Class )

コピー動作については、ScottMeyersによるEffectiveC++などのC++に関する優れた本を読むことをお勧めします。auto_ptrのコピー動作は非常に直感的ではなく、SO回答の範囲を超えている可能性があります。しかし、何も冒険しませんでした...

auto_ptrがコピーされると、所有権は元のコピーからコピーに移されます。例えば:

auto_ptr <Foo> p1( new Foo ); 

この時点で、p1はFooオブジェクトへのポインタを所有しています。

auto_ptr <Foo> p2( p1 ); 

コピー後、p2はポインターを所有し、 p1はNULLポインターを保持するように変更されます。コピーはC++の多くの場所で行われるため、これは重要です。たとえば、auto_ptrsを値で関数に渡したり、標準ライブラリコンテナに保存したりしないでください。

于 2009-04-29T15:04:51.077 に答える
1

奇妙なコピーの振る舞いは、コピーを作成してもオリジナルを保持できないことです。そのためshared_ptrに(boost::またはstd:: tr1 ::)を使用します。auto_ptrsこれは、とりわけ 、のSTLコンテナを持つことができないことを意味します。auto_ptr<>有効期間が限られているオブジェクトのコピーが1つある場合に非常に便利です。別のにコピーするとauto_ptr<>、最初のものが失われます。ポインタを渡すと、すでに削除されているオブジェクトを使用しようとする可能性が高くなります。

必要に応じて呼び出すことができますSetOponent(*Class);。これにより、実際のアイテムが渡されます(ポインターではなく、オブジェクトが参照に渡されます)。ポインタを渡す場合は、で呼び出すことができますSetOpponent(Class.get())。クラスがスコープ外になると、MyClassが削除されるという問題が引き続き発生します。

于 2009-04-29T15:10:01.970 に答える