#include <iostream>
#include <mutex>
#include <chrono>
#include <thread>
#include <atomic>
class Singleton {
public:
static Singleton* GetInstance() {
std::call_once(m_initInstanceFlag, &Singleton::InitInstance);
return m_instance;
}
private:
Singleton() {}
~Singleton() {}
static void InitInstance() { m_instance = new Singleton(); }
static std::once_flag m_initInstanceFlag;
static std::atomic<Singleton*> m_instance;
};
std::once_flag Singleton::m_initInstanceFlag;
std::atomic<Singleton*> Singleton::m_instance = nullptr;
int main()
{
std::cout << "Singleton instance address: " << Singleton::GetInstance() <<
std::endl;
return 0;
}
#include <iostream>
#include <string>
class Cloneable
{
virtual Cloneable* Clone() = 0;
};
class ConcreteCloneable : public Cloneable
{
std::string m_name;
public:
ConcreteCloneable(std::string name) : m_name(name)
{}