1. 程式人生 > >C++內部類和外部類的互相訪問(d指針和q指針)

C++內部類和外部類的互相訪問(d指針和q指針)

初始化 pro 初始 ogr 封裝 ren 內部類 inner 變量

搬運自我的CSDN https://blog.csdn.net/u013213111/article/details/87858965

d指針和q指針式Qt中常見的封裝方法,由此引出了C++內部類和外部類的互相訪問。
其實也是Pimpl(pointer to implementation, 指向實現的指針)方法。

實驗代碼:
Inner類為Outter類的私有內部類。Inner類中有一個public字符串變量In,Outter類中有一個private字符串變量Out。通過Outter類中的d指針訪問Inner類的setIn()和getIn(),實現對In的讀寫;通過Outter類的d指針訪問Inner類,再通過Inner類中的q指針訪問Outter類,實現對Out的讀寫(實際上是多此一舉,僅用作說明通過q指針實現內部類對外部類的訪問)。由於d指針通過new創建,因此要及時delete並置0;而q指針只是將Outter類的this傳入,因此不必delete。

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class Outter {
 6 private:    
 7     string Out;
 8     class Inner{
 9     public:
10         string In;
11         Outter *q;
12         Inner(Outter *parent) : q(parent){}
13         void set(string &str){
14             q->Out = str;
15 } 16 void get(){ 17 cout << q->Out << endl; 18 } 19 }; 20 Inner *d; 21 public: 22 Outter() : d(new Outter::Inner(this)){} //在初始值列表中初始化d指針(首選) 23 //Outter(){d = new Outter::Inner(this);} //在構造函數中給d指針賦值 24 ~Outter(){ 25 delete
d; 26 d = 0; 27 } 28 void setIn(string &str){ 29 d->In = str; 30 } 31 void getIn(){ 32 cout << d->In << endl; 33 } 34 void setOut(string &str){ 35 d->set(str); 36 } 37 void getOut(){ 38 d->get(); 39 } 40 void printOut(){ 41 cout << Out << endl; 42 } 43 }; 44 45 int main() 46 { 47 Outter T; 48 string t1 = "In", t2 = "Out"; 49 T.setIn(t1); 50 T.getIn(); 51 T.setOut(t2); 52 T.getOut(); 53 T.printOut(); 54 return 0; 55 }

輸出為:
In
Out
Out

參考:

D指針/Q指針在C++中的使用 https://blog.csdn.net/haoxinhaoxin/article/details/79473930

c++內部類怎麽訪問外部類 https://bbs.csdn.net/topics/310029123

C++ Programming/Idioms https://en.wikibooks.org/wiki/C++_Programming/Idioms

C++內部類和外部類的互相訪問(d指針和q指針)