2012-04-07 87 views
1

我有以下类:集装箱,然后偶联的类,继承元件,例如按钮,输入,等...多态性和指针的数组(C++)

添加元素,集装箱阵列时,我有一个问题,我的主要()看起来是这样的:

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

其中“...”有一些构造参数。

在容器类我有一个数组的指针来存储属于该容器中的所有元素:

Element ** elements; 

但我遇到的问题是如何实现Add方法,我希望的东西像这样将工作:

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

(元件阵列被分配:元素=新的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

使用STL有什么问题?你为什么不想用它?它让生活变得如此简单 – 2012-04-07 13:17:52

+1

您在这里犯了一个重大错误,那就是使用_temporary_变量的地址并将其存储。 “Add”的参数只是暂时的,在通话结束后对象将被销毁。除此之外,我同意@TonyTheLion,为什么不使用非常好的标准容器? – 2012-04-07 13:20:44

+0

可能是这样,我需要复制元素并存储动态分配副本的地址。 我不能使用STL,因为它是在没有STL的情况下在环境中测试的分配。 – Smaug 2012-04-07 13:28:33

回答

2

Add应该采取指针:

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

那么你可以这样调用

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

如果你真的不能改变调用的代码,你需要以某种方式创建临时的副本。 例如通过在CControl中执行虚拟Clone方法,Input,Button调用它在Add中。

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

'elements [elemCnt ++] =&newElement;'应该只是'elements [elemCnt ++] = newElement;'。 – 2012-04-07 13:19:22

+0

问题是我需要main(),因为:/ – Smaug 2012-04-07 13:22:25

+0

@JoachimPileborg - 谢谢,编辑了答案。 – Henrik 2012-04-07 13:22:53

0

这是不可能解决这个代码不改变main,因为你尝试存储到一个临时的参考。无论你做什么,这都是可以撤销的。