From: Faisal on 28 Dec 2009 08:15 I have a generic Singleton class. //Singleton.h template <class TYPE> class CSingleTon { protected: CSingleTon() {} virtual ~CSingleTon(){} public: static TYPE* Instance() { if( NULL == m_pInstance ) m_pInstance = new TYPE(); return m_pInstance; } static void Destroy() { delete m_pInstance; m_pInstance = NULL; } protected: static TYPE* m_pInstance; }; template <class TYPE> TYPE* CSingleTon<TYPE>::m_pInstance = NULL; #define SET_SINGLETON( classname ) friend class CSingleTon<classname>; //end of file Singleton.h And I uses this class to create singletone classes like class CGlobalDataStore : public CSingleTon<CGlobalDataStore> { SET_SINGLETON(CGlobalDataStore); }; This is working correctly. Now I want to derive a class from CGlobalDataStore( which is also singleton). I tried class CGlobalSignalStore : public CGlobalDataStore { SET_SINGLETON(CGlobalSignalStore); }; But compilation fails showing error. error C2440: 'initializing' : cannot convert from 'CGlobalDataStore *' to 'CGlobalSignalStore *' 1> Cast from base to derived requires dynamic_cast or static_cast int main(int argc, char *argv[]) { //This line working correctly CGlobalDataStore* pGlobalDataStore = CGlobalDataStore::Instance(); //This shows the error CGlobalSignalStore* pGlobalSignalStore = CGlobalSignalStore::Instance (); return 0; } So my question is, How can I implement a derivable singleton class.
From: Igor Tandetnik on 28 Dec 2009 10:23 Faisal wrote: > I have a generic Singleton class. > > //Singleton.h > > template <class TYPE> > class CSingleTon > { > protected: > CSingleTon() > {} > > virtual ~CSingleTon(){} > > public: > static TYPE* Instance() > { > if( NULL == m_pInstance ) > m_pInstance = new TYPE(); > > return m_pInstance; > } > > static void Destroy() > { > delete m_pInstance; > m_pInstance = NULL; > } > > protected: > static TYPE* m_pInstance; > }; > > template <class TYPE> > TYPE* CSingleTon<TYPE>::m_pInstance = NULL; > > #define SET_SINGLETON( classname ) friend class CSingleTon<classname>; > > //end of file Singleton.h > > > And I uses this class to create singletone classes > like > > class CGlobalDataStore : public CSingleTon<CGlobalDataStore> > { > SET_SINGLETON(CGlobalDataStore); > }; > > This is working correctly. > > Now I want to derive a class from CGlobalDataStore( which is also > singleton). Don't derive from CSingleTon in the first place. You can do something like this: class CGlobalDataStore { static CGlobalDataStore* Instance() { return CSingleTon<CGlobalDataStore>::Instance(); }; class CAnotherStore: public CGlobalDataStore { static CAnotherStore* Instance() { return CSingleTon<CAnotherStore>::Instance(); }; I don't quite see how this design makes sense though. You now have two singletons - one CGlobalDataStore and one CAnotherStore - so there are two instances of CGlobalDataStore in the program (one on its own and one as a subobject of CAnotherStore), which kind of defeats the point of it being a singleton. -- With best wishes, Igor Tandetnik With sufficient thrust, pigs fly just fine. However, this is not necessarily a good idea. It is hard to be sure where they are going to land, and it could be dangerous sitting under them as they fly overhead. -- RFC 1925
From: Leigh Johnston on 28 Dec 2009 11:54 Try using the Meyers Singleton instead (no need for a Destroy method then): template <typename T> struct singleton { static T& instance() { static T sInstance; return sInstance; } }; struct foo : singleton<foo> { foo() { std::cout << "foo::foo()\n"; } ~foo() { std::cout << "foo::~foo()\n"; } void func() { std::cout << "foo::func()\n"; } }; int main() { foo::instance().func(); } However be aware that singletons should be used rarely not routinely, take a look at http://i42.co.uk/stuff/spaghetti.htm
|
Pages: 1 Prev: An advice is solicited Next: "PORTING C" > Not including a header file = no errors ???? |