搬运自我的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