无需强制转换即可访问C ++向量元素

时间:2012-07-28 23:04:29

标签: c++ mosync

我正在使用MoSync / MAUI创建移动应用程序原型,但我遇到了类的问题 继承性:

标准MAUI小部件的类层次结构是:

Widget
    EditBox
    Label
    ListBox
    ...

然后,因为我想为所有小部件添加标准行为,所以我单独做了一个 用于定义该行为的类:

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

并为每个小部件类型创建子类:

class xEditBox: public xFocusCtrl, public EditBox 
{
public:
    ...
}

class xLabel: public xFocusCtrl, public Label 
{
public:
    ...
}

...

然后,在几个地方我需要使用MoSync getChildren()函数访问所有小部件, 定义为:

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

我的问题是:鉴于这种层次结构,我可以迭代所有的孩子,但无法访问 没有强制转换的新行为(例如:widget-&gt; member1)。但是,我怎么能一般地将每个小部件投射到 它的课程?到目前为止,我正在测试每个可能的小部件类,其中包含一些代码,如

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

1 个答案:

答案 0 :(得分:1)

您应该使用dynamic_cast

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