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。
#include <iostream>
using namespace std;
class Outter {
private:
string Out;
class Inner{
public:
string In;
Outter *q;
Inner(Outter *parent) : q(parent){}
void set(string &str){
q->Out = str;
}
void get(){
cout << q->Out << endl;
}
};
Inner *d;
public:
Outter() : d(new Outter::Inner(this)){} //在初始值列表中初始化d指针(首选)
//Outter(){d = new Outter::Inner(this);} //在构造函数中给d指针赋值
~Outter(){
delete d;
d = 0;
}
void setIn(string &str){
d->In = str;
}
void getIn(){
cout << d->In << endl;
}
void setOut(string &str){
d->set(str);
}
void getOut(){
d->get();
}
void printOut(){
cout << Out << endl;
}
};
int main()
{
Outter T;
string t1 = "In", t2 = "Out";
T.setIn(t1);
T.getIn();
T.setOut(t2);
T.getOut();
T.printOut();
return 0;
}
输出为:
In
Out
Out