4

クラス(A)内に、基本的に別のクラス(B)へのポインターをパラメーターとして受け取る関数があります。Bクラスは、他の複数のクラスにも継承され、それらも受け入れる必要があります。

私がやりたいのは、このポインタの所有権を取得して、後でクラスで使用するために保存することです。このポインタは、他の目的でクラスの外部で再び使用されることはありません。パラメータをshared_ptrにしますが、一緒に作業している他の人がスマートポインタのすべてを完全に理解していないため、これはできるだけ避けたいと思います。これを行う方法はありますか?

これが私がやりたいと思う一種の例ですが、私がテストしたことからはこれは機能しません。

//In .h file
std::vector< unique_ptr< B > > data_store;

//In .cpp file
void A::add_data(B* NewItem)
{
    data_store.resize(data_store.size()+1);
    data_store[data_store.size()-1] = NewItem;
}

次に、コピーコンストラクターなどを使用して、クラス内でスマートポインターを使用したいと思います。手動で削除する必要がある場合は、やらなければならないことが少し醜くなる可能性があります。それに関する問題は、それが入ってくる基本クラス(B)なのか、それともBから継承したクラスなのかわからないということです。クラスのチェック可能なIDの一種であり、正しいコピー/移動コンストラクターを使用します。これは絶対に避けたいと思います。

2012年3月12日の英国時間午前10時頃に更新したllvmから更新されたClangとlibC++を使用しています。

4

2 に答える 2

4

クラスが唯一の所有権を持っている、共有されるべきではないポインタstd::unique_ptr<T>の場合、正しい選択です。所有しているオブジェクトがスコープ外になったり削除されたりすると、ポインターは自動的に削除されます。実際には、このメンバーが共有されるはずであることが他の開発者に伝達されるため、共有ポインターを使用しないことをお勧めします。

だから、コピーのために。cloneサブクラスを持つ可能性のあるオブジェクトへのポインターがあるため、通常のコピー コンストラクターの代わりにイディオムを使用する必要があります。これは通常clone、クラスへのポインター (またはスマート ポインター) を返す仮想関数を持つことによって実装されます。これには、すべてのサブクラスがこれを再実装し、自身のコピーを返す必要があります。

class Base {
    ...
    virtual std::unique_ptr<Base> clone() const = 0;
    ...
};

class Subclass {
    ...
    virtual std::unique_ptr<Base> clone() const {
        return std::unique_ptr<Base>(new Subclass(*this));
    }
};

所有しているオブジェクトにコピー コンストラクターがある場合、それ自体のコピーを作成するときに、所有しているオブジェクトでこのクローン メンバー関数を呼び出す必要があります。

于 2012-03-12T11:39:29.013 に答える
0

ポインタのベクトルを所有するオブジェクトを作成する場合は、boost::vector_ptrを使用する必要があります。それ自体に含まれるすべてのオブジェクトを自動的に削除します

于 2012-03-12T11:56:21.363 に答える