C++ note 3 - Singleton
Singleton:
- Singleton design pattern is a software design principle that is used to restrict the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system
- Can act just like namespace
A simple implementation:
123456789101112131415161718192021class Singleton{private:Singleton() {} // Disable from instantiatingstatic Singleton Instance;public:static Singleton& Get() {return s_Instance;}void Func();};Singleton Singleton::s_Instance;int main(){Singleton::Get().Func();return 0;}Issues from above:
- One can do
Singleton instance = Singleton::Get();
instead ofSingleton& instance = Singleton::Get();
will copy all data in the Singleton and create an additional Singleton. Should mark the copy constructer, and the assignment operator as delete.123456789101112131415class Singleton{private:Singleton() {} // Disable from instantiatingstatic Singleton Instance;public:Singleton(const Singleton&) = delete; // solve the issueSingleton& operator=(const Singleton&) = delete;static Singleton& Get() {return s_Instance;}void Func();};
- One can do
Can remove the global initialization and create inside
Get()
.12345678910111213class Singleton{private:Singleton() {} // Disable from instantiatingpublic:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton& Get() {static Singleton s_Instance; // Init from herereturn s_Instance;}void Func();};A final version:
1234567891011121314151617181920212223#include <iostream>class Singleton{private:Singleton() {} // Disable from instantiatingpublic:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton& Get() {static Singleton s_Instance; // Init from herereturn s_Instance;}void Func() {std::cout << "Func called" << std::endl;};};int main(){Singleton::Get().Func();return 0;}