Dhi*_*sen -2 c++ singleton implementation static-methods
在这些条件下,我编写了下一个Singleton类:
1 - 我想要一个且只有一个类的实例存在并且可以从整个游戏引擎访问.
2 - Singleton被密集使用(每帧数千次)所以我不想写一个额外的GetInstance()函数,我试图避免任何额外的函数调用性能
3 - 一种可能性是让GetInstance()像内联一样这个 :
inline Singleton* Singleton::GetInstance()
{
static Singleton * singleton = new Singleton();
return singleton;
}
Run Code Online (Sandbox Code Playgroud)
但这会引起一个引用问题,每次调用时都会有一个对单例的新引用,用于修复用c ++编写的内容:
class Singleton{
private:
static Singleton* singleton;
Singleton(){}
public:
static inline Singleton* GetInstance() // now can be inlined !
{
return singleton;
}
static void Init()
{
// ofc i have to check first if this function
// is active only once
if(singleton != nullptr)
{
delete singleton;
}
singleton = new Singleton();
}
~Singleton(){} // not virtual because this class can't be inherited
};
Singleton* Singleton::singleton = nullptr;
Run Code Online (Sandbox Code Playgroud)
这个实现可能会遇到什么问题?
Jar*_*d42 11
您的第一个实施问题是new您唯一的泄密.以及强制用户检查指针有效性的签名.
由于您需要使用两步初始化,并且不禁止复制/移动/分配,因此您的第二个实现会出现更多问题.
只需使用迈耶斯的单身人士:
class Singleton{
private:
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton&) = delete;
Singleton operator&(const Singleton&) = delete;
public:
static Singleton& GetInstance()
{
static Singleton instance;
return instance;
}
};
Run Code Online (Sandbox Code Playgroud)
除了@ Jarod42的回答之外,我想指出你也可以通过制作模板来实现一个通用的单例,并在CRTP类中使用它:
template<typename T>
class Singleton {
protected:
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton&) = delete;
Singleton operator&(const Singleton&) = delete;
public:
static T& instance() {
static T instance;
return instance;
}
};
Run Code Online (Sandbox Code Playgroud)
然后扩展它:
struct MySingleton : Singleton<MySingleton> { /* ... */ };
Run Code Online (Sandbox Code Playgroud)