0

ここでは、私が使用しているパターンに関して別のルートを検討する必要があると思いますが、まず専門家の意見を得ると思いました。ポインタベースクラスを使用した=演算子付きの多態性

私はクラスクラス(UsingClass)を持っています。このクラスは、ベースクラスポインタの動的リストを保持しています。新しいオブジェクトをリストに追加するとき、私は実際にそれを多相的に動作させることができないので、どのタイプのオブジェクトであるのか把握する必要があります。タグのついた行「これは私が好きなようにはうまくいかない!!」理想的には、関心のあるDerivedクラスから=演算子を多面的に使用しますが、残念ながらBaseクラスのデフォルト=演算子のみを使用しています.... Base純粋仮想を作成した場合、おそらく動作します自分自身のデータメンバー)、私は本当に両方の間で共通のメンバーを保持するDerivedクラスを持っていない(おそらく私は餌をカットし、それを行う必要があります)。

私はちょうど完全に間違ったパターンを使用しているかもしれませんが、私はどのような選択肢を考慮すべきか分かりません。

コードがコンパイルされているとは限りませんが、私と一緒に作業してください。前もって感謝します!

//code block 
class Base { 
    protected: 
    int x; 
    float y; 
    string type; // default to Derived1 or Dervied2 depending on the object inst 

    public: 
    virtual int functionM(int l) = 0; 
    int functionN(int P); 
}; 

class Derived1 : public Base { 
    protected: 
    int a; 

    public: 
    int functionM(int l); 
    float functionR(int h); 
}; 

class Derived2 : public Base { 
    protected: 
    int b; 
    float r; 

    public: 
    int functionM(int l); 
    float functionR(int h); 
}; 

#define MAX_ARRAYSIZE 10 

class UsingClass { 
    private: 
    Base* myDerived1And2DynamicList[MAX_ARRAYSIZE]; 
    int indexForDynamicList; 

    public: 
    void functionAddDerivedToList(*Base myInputPtr) { 
     if((indexForDyanmicList + 1) < MAX_ARRAYSIZE) { 
      if(myInputPtr->type == "Derived1") { 
       myDerived1And2DynamicList[indexForDyanmicList+1] = new Derived1; 
       *myDerived1And2DynamicList[indexForDyanmicList+1] = *myInputPtr; // THIS WILL NOT WORK LIKE I WANT IT TO!! 
      } else if (myInputPtr->type == "Derived2") { 
       myDerived1And2DynamicList[indexForDyanmicList+1] = new Derived2; 
       *myDerived1And2DynamicList[indexForDyanmicList+1] = *myInputPtr; // THIS WILL NOT WORK LIKE I WANT IT TO!! 
      } 
     } 
    } // end of void function 
}; 
+2

あなたの質問は不明です。おそらく、あなたの解決策を修正しようとするのではなく、実際にあなたが達成しようとしていることを私たちに伝えることから始めるべきです... –

+1

私はあなたに 'clone()'メソッド... google cloneとたくさんの例があるように見えます。 –

+0

http://icu-project.org/docs/papers/cpp_report/the_assignment_operator_revisited.htmlこれにより、多くのことが解決される可能性があります。 – DumbCoder

答えて

3

タイプを確認するのではなく、単にクラス 'Base'に仮想関数を追加して呼び出すことができます。これは、次のように無効functionAddDerivedToList(*ベースmyInputPtr)を単純化する:

void functionAddDerivedToList(*Base myInputPtr) 
{ 
    if((indexForDyanmicList + 1) < MAX_ARRAYSIZE) { 
     myDerived1And2DynamicList[indexForDyanmicList+1] = myInputPtr->clone(); 
    } 
} 

クローンは常にクラスのコピーコンストラクタを呼び出すために実装されるだろう。だから、ベース、以下を追加して:

virtual Base* clone() = 0; 

実装は常にこの形を取るでしょう(例はDerived1、あなたの例では、ベースのサブクラスのためです):私は見

virtual Base* clone() { return new Derived1(*this); } 
0

一つの問題は、ということですあなたは "ベース"オブジェクトのリストを含むCスタイルの配列を歌います。この場合の配列内の要素のサイズは、sizeof(Derived1)およびsizeof(Derived2)とは異なるsizof(Base)になります。どちらの派生も異なるかもしれません。この場合、実際のオブジェクトの代わりにBaseオブジェクトのポインタが配列に含まれるようにすることができます。これにより、サイズを4バイトに統一し、配列内のオブジェクトにポインタとしてアクセスできます。配列にはポインタが含まれているので、単に配列に挿入したい場合は型を決定する必要はありません。

void functionAddDerivedToList(Base* myInputPtr) 
{ 
    if((indexForDyanmicList + 1) < MAX_ARRAYSIZE) 
     myDerived1And2DynamicList[indexForDyanmicList+1] = myInputPtr; 
} 

アレイからオブジェクトにアクセスする場合は、このようなことができます。

Base* p = myDerived1And2DynamicList[index]; 
p->MyMethod(); 

あなたは正しいMyMethodは機能が、この場合のpの実際の型に基づいて呼び出されることを信頼することができます。

0

私はクラスクラス(UsingClass)があり、これは基本クラスポインタの動的リストを保持しています。

申し訳ありませんが、間違った構文です。しかし、そのように行かないでください。

まず、クラスに仮想デストラクタを与えます。そうしないと、メモリリークが発生します。

次に、UsingClassコンテナを再設計します。動的に配置されたポリモーフィックオブジェクトを保持するためにBaseメンバーへのshared_pointerのベクトルを与えます。 (あなたは非C++ 0xのコンパイラを使用する場合は、std::tr1::shared_ptrを使用することができます。)

class UsingClass { 
private: 
    std::vector<std::shared_ptr<Base> myList; 
    // int indexForDynamicList; is now myList.size() 

public: 
    void Add(Base* myInputPtr) { 
    myList.push_back(myInputptr); 
    } 
// ... 
}; 

が多型のオブジェクトを追加するには、

UsingClass container; 
container.add(new Base); 
container.add(new Derived1); 
container.add(new Derived2); 

を使用しますが

を繰り返すことによって、すべての多型のメソッドを呼び出すことができます
for (size_t i = 0; i < myList.size(); ++i) 
{ 
    myList->functionM(); // give the function a more "speaking" name 
} 

shared_ptrを使用すると、1つのオブジェクトに多くのポインタを置くことができ、メモリの解放に気を付ける必要はありません。ポインタをコピーしてもオブジェクト(いわゆる浅いコピー)はコピーされません。実際にオブジェクトをコピーする必要がある場合(ディープコピーとも呼ばれます)、Baseと派生クラスは仮想メソッドclone()を実装する必要があります。

関連する問題