重构 — 改善既有的类图设计
条款9:用Pimpl惯用法隐藏细节
黄国强 2008/7/14
重构前的代码。
// UseBySample.h
class CUseBySample
{
public:
CUseBySample(void);
~CUseBySample(void);
};
class CSample
{
public:
CSample(void);
~CSample(void);
private:
CUseBySample m_UseBySample;
};
调用 CSample 的人来说,可以看到 CUseBySample。画图应该是这样。如图一所示。
重构后的代码。对调用 CSample 的人来说,CUseBySample 就好像不存在一样。
// Sample.h
class CSampleImpl;
class CSample
{
public:
CSample(void);
~CSample(void);
private:
std::auto_ptr<CSampleImpl *> m_Pimpl;
};
// SampleImpl.h
class CSampleImpl
{
public:
CSampleImpl(void);
~CSampleImpl(void);
private:
CUseBySample m_UseBySample;
};
条款9:用Pimpl惯用法隐藏细节
黄国强 2008/7/14
重构前的代码。
// UseBySample.h
class CUseBySample
{
public:
CUseBySample(void);
~CUseBySample(void);
};
class CSample
{
public:
CSample(void);
~CSample(void);
private:
CUseBySample m_UseBySample;
};
调用 CSample 的人来说,可以看到 CUseBySample。画图应该是这样。如图一所示。

图一
重构后的代码。对调用 CSample 的人来说,CUseBySample 就好像不存在一样。
// Sample.h
class CSampleImpl;
class CSample
{
public:
CSample(void);
~CSample(void);
private:
std::auto_ptr<CSampleImpl *> m_Pimpl;
};
// SampleImpl.h
class CSampleImpl
{
public:
CSampleImpl(void);
~CSampleImpl(void);
private:
CUseBySample m_UseBySample;
};

图二
图二演示了重构后的图,在这里,CSampleImpl 与 CSample 之间指针是从 CSampleImpl 指向 CSample。理由是,CSample 当作了接口,CSampleImpl 为 CSample 的实现类,故我认为应该这样画。