C++ 友元:在一个类中,访问另一个类中的数据。

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指针),这样就能保证两个对象指针指向同一地址。

猜你喜欢

转载自www.cnblogs.com/leocc325/p/13196339.html