Вы можете определить сингелтонский класс 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();
}
единственное, что я не перечислил выше, это управление вашей памятью, что означает, кто сам создает объект singleton (вызывает статический API ms_zCreate () производного класса).
Вы можете позвонить из другого места или напрямую из своего кода.
Обратите внимание, что вы можете манипулировать вышеописанным подходом ifc, чтобы он не был одноэлементным.
Пока класс ifc не меняется, клиентскому коду не потребуется повторная компиляция, если вы измените класс наследования (реализации).