屏蔽实现可以通过PIMPL 习惯用法或使用简单的多态性来完成,这是一种工厂方法模式。基本上,你创建一个接口类,IA
像这样说:
/* File: A.h */
#include <memory> /* For std::shared_ptr */
class IA;
/* Change the line below to boost::shared_ptr<> or
* another implementation of a shared-pointer.
* Read more:
* http://en.wikipedia.org/wiki/Smart_pointer#shared_ptr_and_weak_ptr
*/
typedef std::shared_ptr<IA> APtr;
class IA {
public:
static APtr Create(const int foo);
IA(){}
virtual ~IA(){}
virtual void somePublicMethod() = 0;
};
在您的 A.cpp 中,您将拥有它的实现:
/* File: A.cpp */
#include "A.h"
class A : public IA
{
public:
A(const int foo):foo_(foo){}
void somePublicMethod(){/* Your awesome implementation goes here */}
};
APtr IA::Create(const int foo)
{
return APtr(new A(foo));
}
这样,您只传递接口并且只向外部世界公开公共方法,内部方法位于您的 CPP 文件中。
好处:
缺点:
- 您需要为要隐藏的每个类创建一个接口
- 您的用户必须调用工厂方法来创建实例。例如
Create()
在上面的例子中。
- 您将始终让您的类实例在堆内存中而不是在堆栈中,即,您的实现实例将始终必须是一个指针。(阅读更多:堆内存与栈内存)