1

次のクラスがあります:ContainerElement 、そしてElementから継承するいくつかのクラス。ボタン、入力など..。

コンテナ配列に要素を追加するときに問題が発生します。main()は次のようになります。

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

ここで、「...」はいくつかのコンストラクターパラメーターです。

コンテナクラスには、そのコンテナに属するすべての要素を格納するためのポインタの配列があります。

Element ** elements;

しかし、私が抱えている問題は、Addメソッドを実装する方法です。私は、このようなものが機能することを望んでいました。

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

(要素配列が割り当てられます:elements = new Element * [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のものを提案しないでください。

4

2 に答える 2

2

Addポインタを取る必要があります:

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

次に、このように呼び出すことができます

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

呼び出しコードを本当に変更できない場合は、何らかの方法で一時的なコピーを作成する必要があります。たとえば、 で仮想Cloneメソッドを実装しCControlInputButtonそれを呼び出しますAdd

void Add(const CControl & newElement){                        
    elements[elemCnt++] = newElement.Clone();
}
于 2012-04-07T13:18:20.040 に答える
0

を変更せずにこのコードを修正することは不可能です。これはmain、一時への参照を保存しようとするためです。これは何をしても元に戻せません。

于 2012-04-07T13:30:00.577 に答える