3

バーチャル コピー コンストラクターを使用すると、クラスVehicleには、copy()継承されたすべてのクラスCarが実装するようなバーチャル メンバー関数があります。

後で、他のいくつかのクラスは、メンバー変数として任意のタイプの車両を持つことができます。

struct Foo {
  Vehicle *v;
  Foo(const Vehicle &veh) {
    v = veh.clone();
  }
};

要点がわかりません。このように「その場で」削除しclone()て実行してみませんかnew

struct Foo {
  Vehicle *v;
  Foo(Vehicle *veh) {
    v = veh; //veh has no clone()
  }
  ~Foo() {
    delete v;
  }
};

//elsewhere
Foo f(new Car());

欠点は何ですか (「インプレース」作成でのみ機能すること以外)? 今ではクローンを実装する必要はなく、すべてがはるかに簡単に思えます。

4

4 に答える 4

4

それらのポイントは、基本クラスへの既存のポインターがあり、「それが何であれ」のコピーが必要な場合です。

検討:

class Base;
class Derived1 : public Base;
class Derived2 : public Base;

Derived1* d1 = new Derived1();
Derived2* d2 = new Derived2();
makeACopy(d1);
makeACopy(d2);

void makeACopy(Base* base) {
    // ???  What is it?
};

こことここで私の答えを見てください。

于 2013-05-01T13:06:53.550 に答える
2

さて、あなたの例では、うまくいきます。しかし、次の場合はどうでしょう。

 Foo* MakeCar()
 {
    Car c;
    Foo *f = new Foo(&c); 
 }

また:

 Car *c = new Car;
 Foo f(c);
 delete c;
 ... use f in a way that needs c here. 

オブジェクトを複製することにより、上で作成した問題はなくなります。Foo オブジェクトは、Car の存続期間を完全に制御します。

Car編集:そして、それが実際にどのオブジェクトであるかに応じて、MotorBikeTruckが異なることを実行できるように、それは仮想関数でなければなりません。

于 2013-05-01T13:04:43.077 に答える
1

2 番目の例は 3 つのルールに従っていないため、Foo がコピーされるとクラッシュします (たとえば、std::vector で Foo を使用した場合)。

ほとんどの場合、C++ では作業コピー コンストラクターが必要であり、clone はそれを実現するための優れた方法です。

于 2013-05-01T13:02:49.097 に答える
1

これを想像してください:

Car *c = new Car();
Foo f1(c);
Foo f2(c);

...次に、Foo デストラクタが呼び出されたときの花火を見てください。

于 2013-05-01T13:02:50.333 に答える