C++内部类和外部类的互相访问(d指针和q指针)

2019-03-01 10:14:55来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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


原文链接:https://www.cnblogs.com/H-Lyric/p/10456478.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:10个经典的Java面试题集合

下一篇:mybatis_02简单操作数据库