您可以定義一個singelton IFC(即您的客戶將引用純虛)類。我認爲這種設計模式被稱爲「Singelton工廠方法」。 我希望我的長答案能幫助你:)。
只要你不改變公共接口(方法列表),如果你改變你的代碼,你的客戶就不需要重新編譯。
類似:
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();
}
我沒有上面列出的唯一的事情就是你的內存管理,這意味着誰創造的單對象本身(調用派生類的ms_zCreate()靜態API)。您可以從其他地方或直接從您的代碼中調用它。
通知您可以操縱上述IFC方法是非singelton實施。 只要ifc類不更改,如果您修改派生(實現)類,則客戶端代碼將不需要重新編譯。
使用迭代器和'size_type'比使用整數索引和'operator []'更具有通用性。迭代器抽象了容器的類型,'size_type'允許size值是任何整型。 – 2011-12-29 06:04:48
如果稍後更改實施以使用Boost等類型,那麼使用我的STL迭代器的客戶端將需要重新編譯它們嗎? – TownCube 2011-12-29 06:08:54
你可以爲迭代器編寫自己的包裝器,就像使用vector一樣。但是,是的,如果'size_type'的類型發生了變化,那麼它們將不得不重新編譯。 – 2011-12-29 06:16:56