2012-04-07 85 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,因爲你嘗試存儲到一個臨時的參考。無論你做什麼,這都是可以撤銷的。