接受其他类对象作为C ++中某个类对象的参数

问题描述 投票:-2回答:1

我正在创建一个GUI库/框架,每个小部件都有自己的类,我想创建一个具有参数(小部件*父级)的构造函数。现在我希望该参数可以接受每个小部件,所以框架,按钮,滑块等。我将如何做到这一点?

我已经尝试过使用模板,但是对于我想要做的事情,模板不会起作用,因为它们必须在标题中完全定义,因为我正在创建一个动态链接库。

这是一些我想要它的示例代码:

        class frame
        {
        public:
            /*where this parameter accepts every widget class object*/
            frame(widget* parent);
            ~frame();

        private:
        };

请记住参数widget * parent,widget基本上是所有小部件的基类。

我想要的结果最终将是每个widget对象作为参数在传递时实际接受任何类对象的位置。

c++ base-class
1个回答
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(); 

Online demo

© www.soinside.com 2019 - 2024. All rights reserved.