2016-08-15 3 views
-1

私はいくつかの抽象基本クラスを継承する複数のクラス(BとCと言う)を持っています(Aとしましょう)。私は実際にクラスBまたはクラスCのオブジェクト(o1)を指しているクラスAへのポインタ(p1)を持っています。次にクラスAに別のポインタ(p2)を持っていて、別のオブジェクトo2)はo1と同じです。問題は、その時点で、私はどのタイプo1があるのか​​分からないということです。基本クラスへのポインタを持っているときにオブジェクトを複製しますか?

A* newObject() //returns pointer to A which actually points to an object of class B or class C 
{ 
    .... 
} 
A * p1 = newObject(); 
A * p2 = //I want it to point to a new object that is the same as the object p1 is pointing to. How can I do that? 

私はので、私は、遺伝的アルゴリズムを実装していると私は私がそれから突然変異したいクラスを制御する複数の種類を持っていることが必要です。そして何かが繰り返されると、私は子供を親と同じにして、子を突然変異させたいと思っています。これは、p2がp1と等しくないことを意味します。これは、親のコントローラも同様に変更するためです。

+0

デザインパターン "プロトタイプ" を探します。オブジェクトを「クローン」する方法について説明しています。 – Klaus

答えて

4

仮想メソッドClone()をクラスに追加します。

class A { 
public: 
    virtual ~A() = default; 

    auto Clone() const { return std::unique_ptr<A>{DoClone()}; } 
    // ... 
private: 
    virtual A* DoClone() const { return new A(*this); } 
}; 

class B : public A { 
public: 
    auto Clone() const { return std::unique_ptr<B>{DoClone()}; } 
    // ... 
private: 
    // Use covariant return type :) 
    B* DoClone() const override { return new B(*this); } 
    // ... 
}; 

class C : public A { 
public: 
    auto Clone() const { return std::unique_ptr<C>{DoClone()}; } 
    // ... 
private: 
    // Use covariant return type :) 
    C* DoClone() const override { return new C(*this); } 
    // ... 
}; 

、その後

auto p2 = p1->Clone(); 
+0

クラスAは抽象クラスなので、 'new A(* this)'は有効ではないと思われます。 – indjev99

+0

だから '仮想A * DoClone()const = 0'です。 – Jarod42

+0

2つのバージョン(最初に投稿したものとDoCloneを使ったもの)の違いは何ですか?また、 'auto'の必要性はコンパイル時に行われないので、' auto'を使用すると助けになりませんか? – indjev99

関連する問題