マスキングの実装は、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()
、上記の例では。
- クラス インスタンスは常にスタックではなくヒープ メモリ内にある必要があります。つまり、実装インスタンスは常にポインタでなければなりません。(続きを読む:ヒープ vs. スタック メモリ)