On 28 Aug, 18:12, puzzlecracker <ironsel2...@gmail.comwrote:
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