我正在创建一个GUI库/框架,每个小部件都有自己的类,我想创建一个具有参数(小部件*父级)的构造函数。现在我希望该参数可以接受每个小部件,所以框架,按钮,滑块等。我将如何做到这一点?
我已经尝试过使用模板,但是对于我想要做的事情,模板不会起作用,因为它们必须在标题中完全定义,因为我正在创建一个动态链接库。
这是一些我想要它的示例代码:
class frame
{
public:
/*where this parameter accepts every widget class object*/
frame(widget* parent);
~frame();
private:
};
请记住参数widget * parent,widget基本上是所有小部件的基类。
我想要的结果最终将是每个widget对象作为参数在传递时实际接受任何类对象的位置。
您需要使每个可能类型的窗口小部件从同一基类继承,例如:
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();