2012-04-07 10 views
1

私は次のクラスがあります。コンテナ要素、その後、例えば要素からを継承クラスのカップル。 ボタン、入力、等...多型とポインタの配列(C++)

コンテナ配列に要素を追加するとき、私は(私のメインの問題を抱えている)は、次のようになります。

「...」いくつかのコンストラクタです
Container c; 
c.Add(Button(...)); 
c.Add(Input(...)); 

パラメーター。

私はそのコンテナに属するすべての要素を格納するためのポインタの配列を持つコンテナクラスで

Element ** elements; 

しかし、私が抱えている問題は、Addメソッドを実装する方法です私は何かを期待していましたこのように動作します:

void Add(const CControl & newElement){      
    elements[elemCnt++] = &newElement;    
} 

(要素アレイが割り当てられている:要素=新要素* [100];)私は、このコンパイルエラーを取得していますが

main.cpp: In member function ‘Container& Container::Add(const Element&)’: 
main.cpp:138:23: error: invalid conversion from ‘const Element*’ to ‘Element*’ 

const修飾子を削除すると、適切な候補がないというコンパイルエラーが発生します。

事は、C++で多形性と継承を初めて勉強しているので、これについて間違った方向に進むかもしれません。これに関する最良のアプローチは何でしょうか?

PS:主な方法は同じに見える必要があります。また、ベクターやSTLのものを示唆しないでください。

+0

STLを使用すると何が問題になりますか?なぜあなたはそれを使いたくないのですか?それは人生をはるかに簡単にします –

+1

あなたはここで1つの大きな間違いを犯しました。それは_temporary_変数のアドレスを使用してそれを格納しています。 'Add'への引数は一時的なものに過ぎず、呼び出しが終わった後にオブジェクトは破壊されます。それ以外に、私は@ TonyTheLionに同意します。なぜ、とても良い標準コンテナを使用しないのですか? –

+0

それはおそらく、私は要素をコピーし、動的に割り当てられたコピーのアドレスを格納する必要があります。 STLを使用しない環境でテストされているので、私はSTLを使用できません。 – Smaug

答えて

2

Addは、ポインタを取る必要があります。

void Add(CControl * newElement){      
    elements[elemCnt++] = newElement;    
} 

をあなたが本当に呼び出し元のコードを変更できない場合、あなたはこの

c.Add(new Button(...)); 
c.Add(new Input(...)); 

ようにそれを呼び出すことができ、あなたが何らかの形で一時的なコピーを作成する必要があります。 など。仮想CloneCControlに実装することにより、Input,ButtonAddと呼びます。

void Add(const CControl & newElement){       
    elements[elemCnt++] = newElement.Clone(); 
} 
+0

'elements [elemCnt ++] =&newElement;'は単に要素[elemCnt ++] = newElement;でなければなりません。 –

+0

問題は私がmain()を持っている必要があることです:/ – Smaug

+0

@JoachimPileborg - ありがとう、答えを編集しました。 – Henrik

0

それはあなたが一時的に参照を格納しようとしているため、mainを変更せずにこのコードを修正することは不可能です。これはあなたが何をしていても元に戻すことができます。