singleton template class

P

puzzlecracker

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;
};
 
A

andy_westken

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
 
C

cch@srdgame

于 Thu, 28 Aug 2008 10:12:24 -0700,puzzlecracker写到:
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;
};

Following code is one reference for you:
/
**============================================================================
* Copyright (C) 2006 Team RioWow
*
* File: singleton.h
* Description:
This file is to define and surpport different complier and system.
* Author: Rio Chang
* Update: 10/28/2006
=============================================================================*/
#ifndef SINGLETON_H
#define SINGLETON_H

template <class T>
class Singleton
{
public:
static T* getInstance()
{
return &(getSingleton());
}
static T& getSingleton()
{
static T instance;
return instance;
}
~Singleton(){};
protected:
Singleton(const Singleton& sig);
Singleton& operator = (const Singleton& sig);
Singleton(){};
}
;
#endif
//------------------------------------------------------------------------------
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,020
Latest member
GenesisGai

Latest Threads

Top