S
Somebody
So, I've been programming for 16 yrs in C++ and it seems like all the OO
interviews these days think you need to know design patterns to be a good
(or even decent) programmer . What ya gonna do eh? ...
Anyways, this is what I have for my singleton class.
class CSingleton
{
protected:
CSingleton()
{
printf("CSingleton()\n");
}
~CSingleton()
{
printf("~CSingleton()\n");
}
static CSingleton* m_pInst;
public:
static CSingleton* GetInstance()
{
if (m_pInst == NULL)
m_pInst = new CSingleton;
return m_pInst;
}
};
CSingleton* CSingleton::m_pInst = NULL;
int _tmain(int argc, _TCHAR* argv[])
{
CSingleton* p1 = CSingleton::GetInstance();
CSingleton* p2 = CSingleton::GetInstance();
printf("--> %x %x\n", p1, p2);
return 0;
}
Works fine... except...
1) what is the interview approved way to clean up the created object? Having
a static "clean up" method that the user is responsible for calling seems
completely retarded and anti-encapsulation. I've seen some solutions that
create a second CSingletonDestroyer class as static and pass in the pointer.
Then when the CSingletonDestroyer class is killed naturally, it kills the
CSingleton...
2) but the CSingletonDestroyer() class brings up thread safeness issues...
if I wrap my GetInstance() in a critical section how does the critical
section get initialized and cleaned up? I guess I can use a mutex, which
will solve the init problem since that can be static init'ed, but wheres the
clean up?
Keep in mind, I'm doing this for Windows jobs, so no "linux only" solutions
.
interviews these days think you need to know design patterns to be a good
(or even decent) programmer . What ya gonna do eh? ...
Anyways, this is what I have for my singleton class.
class CSingleton
{
protected:
CSingleton()
{
printf("CSingleton()\n");
}
~CSingleton()
{
printf("~CSingleton()\n");
}
static CSingleton* m_pInst;
public:
static CSingleton* GetInstance()
{
if (m_pInst == NULL)
m_pInst = new CSingleton;
return m_pInst;
}
};
CSingleton* CSingleton::m_pInst = NULL;
int _tmain(int argc, _TCHAR* argv[])
{
CSingleton* p1 = CSingleton::GetInstance();
CSingleton* p2 = CSingleton::GetInstance();
printf("--> %x %x\n", p1, p2);
return 0;
}
Works fine... except...
1) what is the interview approved way to clean up the created object? Having
a static "clean up" method that the user is responsible for calling seems
completely retarded and anti-encapsulation. I've seen some solutions that
create a second CSingletonDestroyer class as static and pass in the pointer.
Then when the CSingletonDestroyer class is killed naturally, it kills the
CSingleton...
2) but the CSingletonDestroyer() class brings up thread safeness issues...
if I wrap my GetInstance() in a critical section how does the critical
section get initialized and cleaned up? I guess I can use a mutex, which
will solve the init problem since that can be static init'ed, but wheres the
clean up?
Keep in mind, I'm doing this for Windows jobs, so no "linux only" solutions
.