我正在为我的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))));
对我来说看起来有点冗长,特别是当我有十几个元素时。
这是一个糟糕的设计吗?还有另一种方法来克服这个问题吗?
答案 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
)来代替原始指针。