Widget.h
class Overview_Dialog;//Widget的友元类
class Widget : public QWidget
{
Q_OBJECT
public:
friend class Overview_Dialog;
explicit Widget(QWidget *parent = nullptr);
private slots:
void on_overviewbtn_clicked();
};
void Widget::on_overviewbtn_clicked()
{
Overview_Dialog *o=new Overview_Dialog();
o->show();
}
Widget类,以及他的友元类Overview_Dialog,以及槽函数部分
槽函数的功能是打开一个窗口,这个窗口可以访问Widget类对象的数据来绘制图形。
class Overview_Dialog : public QDialog
{
Q_OBJECT
public:
explicit Overview_Dialog();
~Overview_Dialog();
private slots:
private:
Ui::Overview_Dialog *ui;
Widget *w;
};
Overview_Dialog::Overview_Dialog(Widget *parent) :QDialog(parent),ui(new Ui::Overview_Dialog)
{ w=new Widget();
ui->setupUi(this);
}
这就是友元类的头文件以及构造函数。
可以得知,在主程序中,已经存在了一个Widget对象,除此之外,我们还在主程序中创建了一个Overview_Dialog类的对象,由于Overview_Dialog类的成员数据包括了一个Widget *w,在对其进行初始化之后,整个程序就同时有了两个Widget对象。
我们知道友元类对象可以访问另一个对象中的数据,但是也存在一个问题就是,如何保证这两个Widget对象是同一个对象(地址相同,他们的数据才会相同,否则就知识初始化了第二个Widget对象而已)。
上述代码的结果就是主程序中的Widget对象和友元类中构造函数的w并不是同一个Widget对象,如何解决这个问题呢?
我们可以通过给友元类的构造函数添加一个Widget类指针来解决问题。
因此,我们需要对代码进行修改,首先需要修改的友元类的构造函数
class Overview_Dialog : public QDialog
{
Q_OBJECT
public:
explicit Overview_Dialog(Widget *parent = nullptr);
~Overview_Dialog();
private slots:
private:
Ui::Overview_Dialog *ui;
Widget *w;
};
Overview_Dialog::Overview_Dialog(Widget *parent) :QDialog(parent),ui(new Ui::Overview_Dialog),w(parent)
{
ui->setupUi(this);
}
对创建友元类对象的代码做修改
void Widget::on_overviewbtn_clicked()
{
Overview_Dialog *o=new Overview_Dialog(this);
o->show();
}
请注意以上三部分红色标记出来的代码,首先我们在构造函数的参数中多添加了一个Widget *,并且在构造函数中通过成员初值列的方法将其初始化了。这样第一步的工作就算完成了
剩下的就只需要我们在创建Overview_Dialog对象时,给他一个Widget指针(这里的this就是一个Widget指针),这样就能保证两个对象指针指向同一地址。
原文链接: https://www.cnblogs.com/leocc325/p/13196339.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/199545
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!