Re: C++ Singleton problem...
tobias.sturn@vol.at wrote:
Hi!
I have written this template for making a singleton:
#define DECLARE_SINGLETON(classname) \
private: \
static classname* m_pThis; \
classname(); \
class Guard \
{ \
public: \
~Guard() \
{ \
if(classname::m_pThis != 0 ) \
delete classname::m_pThis; \
} \
}; \
friend class Guard; \
public: \
static classname* getInstance();
#define DEFINE_SINGLETON(classname) \
classname* classname::m_pThis=0; \
classname* classname::getInstance() \
{ \
static Guard guard; \
if(m_pThis == 0) \
{ \
m_pThis = new classname(); \
} \
return m_pThis; \
}
Now i have a class which uses these macros but now i still i can write
constructors make them public and i have won nothing...
class Class
{
public:
Class(int a) {/*i have created an object :(*/
Class(char a)...
};;
How could i make it not possible for the user of the template that he
cant override the constructor?
Thanks very much!!
With the following Singleton class, you can create a Singleton use one
of two methods.
You can derive from Singleton as the foo example class does below, or
you can create a class like the Widget example class.
template<typename T>
class Singleton
{
protected:
Singleton(){}
~Singleton(){}
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
public:
class FriendClass
{
public:
FriendClass():m_MyClass(new T()){}
~FriendClass(){delete m_MyClass;}
T* m_MyClass;
};
static T& Instance() {
static FriendClass Instance;
return *Instance.m_MyClass;
}
};
class Widget {
private:
Widget(){}
~Widget(){}
Widget& operator=(const Widget&);
Widget(const Widget&);
public:
friend class Singleton<Widget>::FriendClass;
int m_i;
};
class foo : public Singleton<foo>{
private:
foo(){}
~foo(){}
foo& operator=(const foo&);
foo(const foo&);
public:
friend class FriendClass;
int m_i;
};
int main(int argc, char* argv[])
{
Widget& MyWidget = Singleton<Widget>::Instance();
foo& Myfoo = foo::Instance();
system("pause");
return 0;
}