に、私は以前の今日(これは本から取られる)の下に定義されたラッパークラスを実装した教育目的のための単純なラッパークラス対スマートポインタ
#ifndef WRAPPER_H
#define WRAPPER_H
template<class T>
class Wrapper
{
public:
Wrapper()
{ dataPtr = 0; }
Wrapper(const T& inner)
{
dataPtr = inner.clone();
}
Wrapper(const Wrapper<T> &original)
{
if (original.dataPtr != 0)
dataPtr = original.dataPtr->clone();
else
dataPtr = 0;
}
Wrapper &operator =(const Wrapper<T> &original)
{
if (this != &original)
{
if (dataPtr != 0)
delete dataPtr;
dataPtr = (original.dataPtr !=0) ? original.dataPtr->clone() : 0;
}
return *this;
}
~Wrapper()
{
if (dataPtr != 0)
delete dataPtr;
}
T &operator*()
{
return *dataPtr;
}
const T&operator*() const
{
return *dataPtr;
}
T *operator->()
{
return dataPtr;
}
const T * const operator->() const
{
return dataPtr;
}
private:
T *dataPtr;
};
#endif
主なアイデアは、ポインタとして機能することですメモリ管理、コピーコンストラクタ、デストラクタ、代入演算子の世話をするという利点があります。これは、クローンメソッドを持つクラスをラップします。つまり、自身のコピーではなく、new
Class(*this)
で作成された新しいコピーへのポインタを返します。
いくつかの点では、ラップされたオブジェクトはこのラッパーを介してのみアクセス可能であるため、unique_ptr
のように見えます。しかし、それは私の質問についてですが、違いがあります。このラッパークラスには、ラップするクラスのオブジェクトへの参照を受け入れることによって定義されたコンストラクターがあります(上記のコードの最初のコンストラクター)。
これは非常に便利です。クラスA
とB
があり、B
のコンストラクタではWrapper<A>
という参照があるとします。 object2
は、上記Wrapper
コンストラクタを使用してWrapper<A>
(その後B
のコンストラクタに渡された)を構築するために使用されているためである
A object1;
B object2(A);
:私は別のオブジェクトA
とオブジェクトB
を構築することができます。
std::memory
のスマートポインタでこれを行うことはできますか?ここで私の主な目標は教育ですが、実際には私は車輪を再構築したくありません。
コピーコンストラクタは、コピー後も一意ではなくなるため、一意のポインタには使用できません。共有ポインタは代わりに_copyable_です。ここでは、コピーは単にポイントオブジェクトの所有権を共有しているという事実を強制しています。 – skypjack
これは、ポインタを共有/移動するのではなく、深いコピーを実行しているようです。 – user4581301
intrusive_ptrのように見えます –