C++內部類和外部類的互相訪問(d指針和q指針)
阿新 • • 發佈:2019-03-01
初始化 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 deleted; 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指針)