您可以定义一个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