在編輯程序的時候,如果文件過多,難免會遇到需要跨文件調用函數的時候,即訪問另一個類中的方法(private和public),但是這些方法是並不能直接使用的,因此,可以使用友元類來完成。
假設有類Test和類MyTest,現在我們想在Test類中,調用MyTest的方法,則需要將Test設置為MyTest的友元類。方法如下,在MyTest.h中添加紅色部分代碼
#ifndef MYTEST_H #define MYTEST_H class Test; class MyTest { Q_OBJECT public: friend class Test; explicit MyTest(); ~MyTest(); void fun_2(); private: void fun_1(); }; #endif // MYTEST_H
不需要在前面#include"test.h",添加上面紅色部分代碼,此時Test就已經是MyTest的友元類,其中fun_1()和fun()_2代碼如下:
void MyTest::fun_2() { cout<<"這是公有函數"; } void MyTest::fun_1() { cout<<"這是私有函數"; }
在Test.h中,需要添加如下代碼
#ifndef TEST_H #define TEST_H #include"mytest.h" class Test { public: explicit Test(); ~Test(); void on_pushButton_clicked(); private: MyTest *m; }; #endif // TEST_H
即,包含MyTest頭文件,以便於創建MyTest類對象,聲明對象之后,需要在Test的構造函數中給其分配地址:m=new MyTest;
下面是Test.cpp中,on_pushButton_clicked()函數的內容
void Test::on_pushButton_clicked() { m->fun_1(); m->fun_2(); }
這個函數用來驗證是否能調用另一個類的方法。
當我把friend class Test注釋掉之后,結果如下
編譯器會顯示fun_1是私有成員無法調用的提示。
把friend class Test取消注釋之后,程序才可以正常編譯,編譯結果如下
表明友元類創建成功。