0

我正在为我的 OpenGL 应用程序创建一个 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))));

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

这是一个糟糕的设计吗?还有其他方法可以克服吗?

4

3 回答 3

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 方法中删除返回的参数。

于 2012-08-30T05:07:17.980 回答
2

您可以 declateadd作为模板方法,并避免所有转换:

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)));
于 2012-08-30T11:16:37.273 回答
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),而不是原始指针。

于 2012-08-30T07:37:52.587 回答