Is there any difference or specific advice when it comes to the following approaches for defining singletons?
In 1, the singleton object is a class private static, but in 2, it's a file static.
Note: m_initedObj1 is just there to show that class has state, and use case is to call this singleton->DoSomething() many times, without needing to init this object again.
1)
// header file class Foo { private: static Foo* s_fooSingleton; Foo(); Obj1 m_initedObj1; public: static Foo* Singleton(); static void ClearSingleton(); Bar DoSomething(...); }; // cpp file Foo* Foo::s_fooSingleton = nullptr; Foo::Foo() { m_initedObj1 = InitObj1Somewhere(); } /*static*/ Foo* Foo::Singleton() { if(!Foo::s_fooSingleton) Foo::s_fooSingleton = new Foo(); return Foo::s_fooSingleton; } /*static*/ void Foo::ClearSingleton() { if(Foo::s_fooSingleton) delete Foo::s_fooSingleton; Foo::s_fooSingleton = nullptr; } Bar Foo::DoSomething(...) { // do something } 2)
// header file class Foo { private: Foo(); Obj1 m_initedObj1; public: static Foo* Singleton(); static void ClearSingleton(); Bar DoSomething(...); }; // cpp file static Foo* s_fooSingleton = nullptr; Foo::Foo() { m_initedObj1 = InitObj1Somewhere(); } /*static*/ Foo* Foo::Singleton() { if(!s_fooSingleton) s_fooSingleton = new Foo(); return s_fooSingleton; } /*static*/ void Foo::ClearSingleton() { if(s_fooSingleton) delete s_fooSingleton; s_fooSingleton = nullptr; } Bar Foo::DoSomething(...) { // do something }