0

クラスがあれば

template <typename T>
struct C {
...

private:
  auto_ptr<T> ptr;
};

C のコピー コンストラクターを定義するにはどうすればよいですか。

まさか

template <typename T>
C<T>::C(const C& other) 

auto_ptr を other からコピーしたいので、所有権を削除して other を変更しました。コピーコンストラクターを次のように定義することは合法ですか?

template <typename T>
C<T>::C(C& other) {}
4

3 に答える 3

1

所有権の譲渡やコピーを防ぎたい場合は、コピー コンストラクターと代入演算子を定義してprivate、クラスのユーザーがオブジェクトをコピーまたは代入することを禁止します。

于 2010-06-21T20:07:32.797 に答える
1

実際にクラスの状態をコピーまたは転送しますか? それをコピーしたい場合は、ポインターを持つ他のクラスと同じように行います。

template < typename T >
C<T>::C(C const& other) : ptr(new T(*other.ptr)) {} // or maybe other.ptr->clone()

実際にポインターの所有権を譲渡したい場合は、非定数の「コピー」コンストラクターを使用してそれを行うことができますが、呼び出しサイトでより明白なことを行うことをお勧めします。コードを読んでいる人に、所有権が譲渡されたことを伝えるもの。

于 2010-06-21T20:09:57.107 に答える
0

「標準」のコピー コンストラクターなどというものはありませんが、人々はそれらが特定の方法で動作することを期待しています。オブジェクトがコピー時に所有権の譲渡を行う場合、この事実を覆い隠すコピー コンストラクターを作成することはお勧めできません。より良いアプローチは、これを明確にする方法を作成することです。(CloneAndTransfer などと呼ぶこともできます。)

于 2010-06-21T20:19:05.920 に答える