2012-07-28 46 views
0

我使用MoSync/MAUI創建一個移動應用原型,但是我面臨與類 繼承了一個問題:訪問C++矢量元素而不鑄造

爲標準窗口小部件MAUI的類層次是:

Widget 
    EditBox 
    Label 
    ListBox 
    ... 

然後,因爲我想一個標準的行爲添加到所有的部件,我做了一個單獨的 類來定義這種行爲:

class xFocusControl: 
public: 
    void method1() {}; 
    void method2() {}; 
    int member1; 
    .... 

和繼承每個插件類型:

然後,在好幾個地方我需要訪問使用MoSync的getChildren()函數, 定義爲所有的部件:

const Vector<Widget*>& MAUI::Widget::getChildren() 

我的問題是:給定這個層次結構,我可以迭代所有的孩子,但不能訪問新行爲(例如:widget-> member1)而不投射。但是,我怎麼能一般地將每個小部件投到其類? ?到目前爲止,我有一些代碼測試每個可能的widget類像

member1 = 0; 
if (isType <xLabel*> (widget)) { 
    member1 = ((xLabel*) (widget))->member1; 
} 

if (isType <xEditBox*> (widget)) { 
    member1 = ((xEditBox*) (widget))->member1; 
} 
... 

,但它看起來不好對我說:我是一個C++新手,和動態語言像Python更加熟練,所以也許我採取了錯誤的做法。

你介意更好的方法來做到這一點?

正如在評論中指出,我使用的常規演員,而不是將dynamic_cast因爲MoSync不支持的dynamic_cast到目前爲止

+0

我找到自己的方式好。但更好地使用dynamic_cast。據我所知,鑄造沒有辦法。會有虛擬功能等,但不幫助你的問題。鑄造是理想的方式。您可以編寫自己的getWidget函數,並將所有witdgets存儲在某個類的某個位置。據我所知,多重繼承不好也許你可以避免這種情況。 – Gabriel 2012-07-28 23:22:04

+0

@Gabriel:但是我怎麼能避免多重繼承?我無法修改基類(Widget),因爲它在MoSync :: MAUI庫中定義。有沒有辦法在沒有子類的情況下在原始類中注入新代碼? – PabloG 2012-07-29 13:36:02

回答

1

您應該使用dynamic_cast

xLabel* label = dynamic_cast<xLabel*>(widget); 
if (label) 
{ 
    member1 = label->member1; 
} 
// dynamic cast failed 
else 
{ 
} 
+0

dynamic_cast在MoSync上不可用,但是無論如何,我應該嘗試手動投射* ANY * posible widget類型嗎? – PabloG 2012-07-28 23:16:59

+0

@PabloG在這種情況下(我們有base_class的對象,並且沒有關於這個對象的類型的信息,我們不能改變層次結構),鑄造只是一種可能的方式。 – ForEveR 2012-07-28 23:24:36