0

さて、ランダムな抽象基本クラスがあり、この基本クラスへのポインタをデータメンバーとして含むBaseクラスがあるとしましょう。Fooそれで

class Foo
{
    public:
        Foo(Base*);

    private:
        Base* ptr;
}

ここで、基本クラスへのポインターを使用する理由は、Fooオブジェクトがポインターを持つ派生クラスを選択できるようにするためです。ここで注意が必要なのは、私にとって、のコンストラクターの実装ですFoo

こうすれば

Foo::Foo(Base* _ptr)
{
    Foo::ptr = _ptr;
};

コンストラクターが終了した後も存在するFoo::ptrため、ユーザーはが指すオブジェクトを調整することができます。定期的に更新する必要があるため、オブジェクトを定数で_ptr指すようにすることはできません。今、コンストラクターの最後に行を追加することを考えていましたが、ユーザーが間接参照を試みる可能性があるため、それも危険である可能性があります。_ptrFoo::ptr_ptr = NULL_ptr

この作業を行うために私が考えることができる唯一の方法は、が指すオブジェクトのコピーを作成し、そのコピーのアドレスに_ptr初期化することです。Foo::ptrただし、コンパイル時にクラスがわからないオブジェクトのコピーコンストラクターを呼び出すことができないため、が指すオブジェクト_ptrには、メンバー関数などが必要になります。Clone()

それで、ない場合にこれを行うためのエレガントな方法はありClone()ますか?それともそれが本当に唯一の可能性ですか?

4

2 に答える 2

0

別の方法は、スマートポインタを使用することです。このようにして、所有権はスマートポインターの実装に割り当てられます。

于 2012-05-03T19:33:32.940 に答える
0

から構築しunique_ptrます。そうすれば、オブジェクトの作成に使用された後は、ユーザーはポインターにアクセスできなくなりますFoo(ユーザーが本当に使用したい場合を除きますget)。

例えば

#include <memory>
struct Bar {};

struct Foo {
  Foo(std::unique_ptr<Bar>&& ptr) : ptr_(std::move(ptr)) {}
  std::unique_ptr<Bar> ptr_;
};

int main()
{
  std::unique_ptr<Bar> tt(new Bar());
  Foo f(std::move(tt));

  return 0;
}
于 2012-05-03T19:33:44.410 に答える