访问C++矢量元素而不进行强制转换

Accessing C++ vector elements without casting

本文关键字:转换 C++ 元素 访问      更新时间:2023-10-16

我正在使用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->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

您应该使用dynamic_cast

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