Will this function is singleton or do I need to declare a ctor in the
derived class as public, as well as copy-ctor and assignment
operator.
template<typename T>
class CSingleton
{
public:
static T& Instance()
{
static T me;
return me;
}
};
class MyClass: public CSingleton<MyClass>
{
public:
MyClass(){};
~MyClass(){};
void Print() { printf("testing %d\n",val); }
int val;
};
Did you mean make the ctor in the derived class PRIVATE, as well as
copy-ctor and assignment?
As your class stands, there's nothing to stop you from instantiating
an instance of MyClass directly. Or inadvertently copying the class.
Making the copy-ctor and assignment operator private would stop people
coding
MyClass copyOfMyClass = MyClass::Instance();
when they meant
MyClass& copyOfMyClass = MyClass::Instance();
But there's no neat way to hide the constructor, to prevent its direct
use. You could do something like this (inc. making CSingleton<> a
friend).
class MyClass: public CSingleton<MyClass>
{
public:
~MyClass(){}
void Print()
{
printf("testing %d (%x)\n", val, (int)this);
}
int val;
private:
// stop direct construction
MyClass():val(0){}
// stop copy construction and copying
MyClass(const MyClass&);
MyClass& operator=(const MyClass&);
// allow CSingleton<> to construct us
friend CSingleton<MyClass>;
};
It is more common to return a pointer from the Instance() method. This
helps with the copy-ctor/assignment related problems.
Also, you might be interested in the thread "Problem with Singleton
template" posted to comp.lang.c++.moderated on 20 Aug. this year
(2008, for people Googling in the future).
Andy