3

假设我有一个较低级别的类层次结构

class A {...};
class A0 : public A {...};
class A1 : public A {...};
class A2 : public A {...};

而且我想用更高的级别来表示它,比如带有图标的 GUI 级别,在这些类中添加虚拟方法可能很容易

virtual Icon A::icon() {return iconOfA;}
virtual Icon A0::icon() {return iconOfA0;}
virtual Icon A1::icon() {return iconOfA1;}
virtual Icon A2::icon() {return iconOfA2;}

但是,我不想更改低级类,有什么简单的方法来实现吗?我希望动态使用它,比如

A* a = new A2();
getIcon(a); // will return iconOfA2.

谢谢。

4

4 回答 4

5

在 GUI 级别创建一个映射,该映射将具有键类和值图标。Icon属于GUI,可能与类本身无关。

于 2013-08-05T17:41:49.513 回答
3
Icon getIcon(A* a_ptr){
    A0* a0_ptr = dynamic_cast<A0*>(a_ptr);
    if(a0_ptr){
        return iconOfA0;
    }
    A1* a1_ptr = dynamic_cast<A1*>(a_ptr);
    if(a1_ptr){
        return iconOfA1;
    }
    A2* a2_ptr = dynamic_cast<A2*>(a_ptr);
    if(a2_ptr){
        return iconOfA2;
    }
    return Icon();
}

alternatively declare a map:

typedef std::map<const type_info*, Icon> Iconmap;
Iconmap iconmap;

//...
iconmap.insert(std::make_pair(&typeid(A0), Icon()));
iconmap.insert(std::make_pair(&typeid(A1), Icon()));
iconmap.insert(std::make_pair(&typeid(A2), Icon()));
//...

and return icon based on RTTI:

Icon getIcon(A* ptr){
    Iconmap::iterator it = iconmap.find(&typeid(*ptr));
    if(it!=iconmap.end()){
        return (*it).second();
    }else{
        return Icon();
    }
}
于 2013-08-05T17:36:46.533 回答
1

使用 RTTI:

if (typeid(*a).name()==typeid(A0).name()) return iconOfA0; else if
(typeid(......
于 2013-08-05T17:31:13.953 回答
0

一种方法是在基类 A 中有一个 Icon 数据字段。这应该是公共的或受保护的,以便在派生类中可以访问它。然后每个类的构造函数可以将值设置为他们自己版本的图标。getIcon 方法将始终为玻璃返回正确类型的图标,并且该方法只需要在基类中定义。

于 2013-08-05T17:31:45.713 回答