1

我有以下类:ContainerElement以及从 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的东西。

4

2 回答 2

2

Add应该带一个指针:

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

那么你可以这样称呼它

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

如果您确实无法更改调用代码,则需要以某种方式创建临时副本。例如,通过在,中实现一个虚拟Clone方法,在 中调用它。CControlInputButtonAdd

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

不更改就无法修复此代码main,因为您尝试存储对临时的引用。无论您做什么,这都是不可撤销的。

于 2012-04-07T13:30:00.577 回答