我有以下课程:容器,元素,然后是来自Element的继承的几个类,例如。 按钮,输入等...
将元素添加到Container数组时遇到问题,我的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的东西。
答案 0 :(得分:2)
Add
应该使用指针:
void Add(CControl * newElement){
elements[elemCnt++] = newElement;
}
然后你可以这样称呼它
c.Add( new Button(...) );
c.Add( new Input(...) );
如果你真的无法更改调用代码,则需要以某种方式创建临时副本。
例如。通过在Clone
,CControl
,Input
中实施虚拟Button
方法,并在Add
中调用它。
void Add(const CControl & newElement){
elements[elemCnt++] = newElement.Clone();
}
答案 1 :(得分:0)
如果不更改main
,则无法修复此代码,因为您尝试存储对临时的引用。无论你做什么,这都是可以撤销的。