Qt中的d指针和q指针,其实就是用pImpl手法来实现对接口细节的隐藏(不过它是用宏做了一些处理),从而做到尽可能少的暴露头文件给用户,多个对象之间进行隐式共享,也能一定程度解决二进制兼容性问题。
// Widget.h
#pragma once
#include <string>
#include "Common.h"
class WidgetPrivate;
class Widget
{
public:
Widget();
~Widget();
void setText(const std::string &text);
std::string text();
private:
WidgetPrivate* d_ptr; // scoped_ptr
Q_DECLARE_PRIVATE(Widget)
Q_DISABLE_COPY(Widget)
};
// Widget.cpp
#include "StdAfx.h"
#include "Widget.h"
#include "WidgetPrivate.h"
Widget::Widget()
: d_ptr(new WidgetPrivate(this))
{
}
Widget::~Widget(void)
{
delete d_ptr;
}
void Widget::setText(const std::string &text)
{
Q_D(Widget);
d->str_ = text;
}
std::string Widget::text()
{
Q_D(Widget);
return d->str_;
}
// WidgetPrivate.h
#pragma once
#include "Common.h"
#include <string>
class Widget;
class WidgetPrivate
{
public:
WidgetPrivate(Widget *parent);
~WidgetPrivate();
private:
std::string str_;
friend Widget;
Widget *q_ptr;
Q_DECLARE_PUBLIC(Widget)
};
// WidgetPrivate.cpp
#include "stdafx.h"
#include "WidgetPrivate.h"
#include <iostream>
WidgetPrivate::WidgetPrivate(Widget *parent)
: q_ptr(parent)
{
std::cout << "WidgetPrivate" << std::endl;
}
WidgetPrivate::~WidgetPrivate()
{
std::cout << "~WidgetPrivate" << std::endl;
}