Developing A Once-Only Initialised Class

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();

More by Author

Must Read