クライアントが参照するシングルトンifc(純粋仮想)クラスを定義できます。私はこのデザインモデルを「シンゲルトン工場アプローチ」と呼んでいると思います。 私の長い答えがあなたを助けてくれることを願っています:)。
パブリックインターフェイス(メソッドリスト)を変更していない限り、コードを変更してもクライアントは再コンパイルする必要はありません。
何かのように:
myClassIfc.h:
Class myClassIfc
{
public:
virtual ~myClassIfc();
///// list all your pure virtual public ifc methods here ////
void m_zRunMyMethod(int nNumber) = 0;
int m_nSize() = 0;
static myClassIfc* ms_pGetImplObj();
protected:
myClassIfc();
static myClassIfc* ms_pImplObj;
}
inline myClassIfc* myClassIfc::ms_pGetImplObj()
{
return ms_pImplObj;
}
myClassIfc.cpp:
#include myClassIfc.h
myClassIfc::myClassIfc()
{
}
myClassIfc::~myClassIfc()
{
}
myClass.h -
Class myClass: public myClassIfc
{
public:
virtual ~myClass();
void m_zRunMyMethod(int nNumber);
int m_nSize();
static void ms_zCreate();
static void ms_zDestroy();
protected:
myClass();
private:
vector<int> myInternalVector;
}
あなたの純粋仮想クラスを実装するMyClassの.cpp:
#include myClass.h
void myClass::m_zRunMyMethod(int nNumber)
{
/// your action
printf("%d\n", nNumber);
}
int myClass::m_nSize()
{
return int(myInternalVector.size());
}
void myClass::ms_zCreate()
{
if (NULL != ms_pImplObj)
{
return;
}
ms_pImplObj = (myClass*) new myClass();
}
void myClass::ms_zDestroy()
{
if (NULL == ms_pImplObj)
{
return;
}
delete ms_pImplObj;
ms_pImplObj = NULL;
}
は、今以上の長いインフラの仕事の後、あなたのクライアントは、私は上記なかった唯一のものは、シングルトンオブジェクト自体を作成し、誰を意味し、あなたのメモリ管理、(ある
#include myClassIfc.h
void main(void)
{
myClassIfc::ms_pGetImplObj()->m_zRunMyMethod(5);
myClassIfc::ms_pGetImplObj()->m_nSize();
}
を使用する必要があります派生クラスの静的API ms_zCreate()を呼び出します)。 他の場所から呼び出すことも、コードから直接呼び出すこともできます。
上記のifcアプローチを非シェルトン実装にすることができます。 ifcクラスが変更されていない限り、派生(実装)クラスを変更した場合、クライアントコードは再コンパイルする必要はありません。
イテレータと 'size_type'を使用することは、整数インデックスと' operator [] 'を使用するよりも一般的に_more_です。反復子はコンテナの型を抽象化し、 'size_type'はサイズの値を任意の整数型にします。 –
後でBoostのようなものを使用するように実装を変更した場合、STLイテレータを使用していたクライアントは再コンパイルする必要がありますか? – TownCube
ベクトルの場合と同じように、イテレータの独自のラッパーを記述することができます。しかし、はい、 'size_type'の型が変更され、それが公開されている場合、再コンパイルする必要があります。 –