标签:通过 overview 问题 pre 参数 class 主程 nullptr view
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指针),这样就能保证两个对象指针指向同一地址。
标签:通过 overview 问题 pre 参数 class 主程 nullptr view
原文地址:https://www.cnblogs.com/leocc325/p/13196339.html