避免许多类型转换

时间:2012-08-30 04:48:39

标签: c++ casting

我正在为我的OpenGL应用程序创建一个UI系统,我有这个设计......

UI管理员:

class UIManager {
public:
  UIElement *add(UIElement *element);
}

示例元素:

class Button : public UIElement {
public:
  Button(UIElement *parent, const string &caption, const Point &position);
}

现在,每次我想实例化一个按钮并保持指针指向它时,我都要写这个:

// somewhere in the header file
UIManager *manager;
Button *button1, *button2;

// in cpp
button1 = static_cast<Button *>(manager->add(new Button(0, "Enter", Point(10, 10))));
button2 = static_cast<Button *>(manager->add(new Button(0, "Exit", Point(10, 50))));

对我来说看起来有点冗长,特别是当我有十几个元素时。

这是一个糟糕的设计吗?还有另一种方法来克服这个问题吗?

3 个答案:

答案 0 :(得分:2)

您可以将按钮分配给要添加的参数内的变量:

// somewhere in the header file
UIManager *manager;
Button *button1, button2;

manager->add(button1 = new Button(0, "Enter", Point(10, 10)));
manager->add(button2 = new Button(0, "Exit", Point(10, 50)));

还从add方法中删除返回的参数。

答案 1 :(得分:2)

您可以将add视为模板方法,并避免所有投射:

class UIManager {
public:
    template<typename T> 
    T* add(T *element) {
      // do something with element
      return element;
    }
}

然后您的客户端代码变为

button1 = manager->add(new Button(0, "Enter", Point(10, 10)));

答案 2 :(得分:0)

add方法声明为转发到实际方法的方法模板:

class UIManager {
public:
    UIElement *add(UIElement *element);
    template<typename T> T *add(T *element) {
        return static_cast<T *>(add(static_cast<UIElement *>(element))); }
}

Button *button1 = manager->add(new Button(0, "Enter", Point(10, 10)));

请注意,您应该使用托管指针(unique_ptr或者shared_ptr)来代替原始指针。