我正在创建一个GUI库/框架,每个小部件都有自己的类,并且我想创建一个具有参数(widget *父级)的构造函数。现在,我希望该参数接受所有可能的小部件,例如框架,按钮,滑块等。我将如何去做?
我已经尝试过使用模板,但是对于我想做的事情,模板将无法正常工作,因为它们必须在标头中完全定义,因为我正在创建动态链接库。 / p>
下面是一些我想要的示例代码:
class frame
{
public:
/*where this parameter accepts every widget class object*/
frame(widget* parent);
~frame();
private:
};
请记住参数widget *父级,widget实际上是所有widget的基类。
我想要的结果最终将是每个小部件对象作为参数在传递时实际上将接受任何类对象的位置。
答案 0 :(得分:0)
您需要使每种可能的小部件都从同一基类继承,例如:
class widget {
public:
widget(widget* parent=nullptr);
virtual ~widget() = default;
// utilities
bool has_parent() { return parent!=nullptr; }
widget* get_parent() { return parent; }
// really useful stuff
virtual void show() = 0; // abstract member function
private:
widget* parent;
};
通过将一些成员函数虚拟化,基类应该是多态的(这样,对象的行为就取决于其真实的类)。
在这里,show()函数甚至是抽象的。这意味着基类没有实现,并且必须在派生类中提供该功能。结果,您不能为基类实例化一个对象。
然后您可以定义派生类:
class frame : public widget {
public:
frame(widget* parent=nullptr);
~frame() = default;
void show() override;
};
始终可以将指向派生类的指针提供给需要指向基类的指针的函数。
以下是上述演示类的成员函数的潜在实现:
widget::widget(widget *parent) : parent(parent) {}
frame::frame(widget *parent) : widget(parent) {}
void frame::show() {
cout << "Frame " << this;
if (has_parent()) {
cout << " -> ";
get_parent()->show();
}
else cout<<endl;
}
请注意,此示例实现允许某些窗口小部件没有父项(顶级项具有nullptr
父项)。然后,您可以按以下方式使用这些类:
frame f1;
frame f2(&f1);
f1.show();
f2.show();