Environment: Visual C++ Version 6
Often, we need a once-only initialised class that is global to the entire system. Examples of such a class would be the loading of a library, or options from the Registry.
This is a base class which provides (a) an initialisation, only if the class is used and (b) ensures a once-only instance for the application.
template <class CLASS>
class CStaticClass
{
public:
virtual ~CStaticClass() { };static CLASS &Get()
{
static CLASS m_theObject;m_theObject.Initialise();
return m_theObject;
}void Initialise()
{
if (!m_fInitialised)
{
OnInitialise();
m_fInitialised = TRUE;
}
}protected:
CStaticClass()
{
m_fInitialised = FALSE;
}virtual void OnInitialise() = 0;
private:
BOOL m_fInitialised;
} ;
An example of use would be for loading a library:
class CMyLibrary : public CStaticClass<CMyLibrary>
{
public:
CMyLibrary()
{
m_hLibrary = NULL;
m_pfnFunction = NULL;
}virtual ~CMyLibrary()
{
if (m_hLibrary != NULL)
{
::FreeLibrary(m_hLibrary);
}
}void DoFunction()
{
if (m_pfnFunction != NULL)
{
m_pfnFunction();
}
else
{
ASSERT(FALSE);
}
}protected:
virtual void OnInitialise()
{
m_hLibrary = ::LoadLibrary(“mylibrary.dll”);if (m_hLibrary != NULL)
{
m_pfnFunction = ::GetProcAddress(m_hLibrary, “MyProc”);
}
}private:
HMODULE m_hLibrary;
FARPROC m_pfnFunction;
} ;
So, to call the designated function, use this line of code:
CMyLibrary::Get().DoFunction();