更好地理解c++中的单例类
Better understanding of Singleton class in C++
我编写了一个非常简单的程序,实现了一个泛型单例类,如下所示:
namespace core
{
template <typename T>
class Singleton
{
protected:
Singleton(void);
Singleton(Singleton const &other);
virtual ~Singleton(void);
public:
Singleton &operator=(Singleton const &other);
static T *GetSingletonPtr(void);
static T &GetSingleton(void);
static void DestroySingleton(void);
private:
static T *m_pInstance;
static T m_Instance;
};
//Globals initialization
template <typename T>
T *Singleton<T>::m_pInstance = NULL;
template <typename T>
T Singleton<T>::m_Instance = T();
//Initialization
template <typename T>
Singleton<T>::Singleton(void)
{
}
template <typename T>
Singleton<T>::Singleton(Singleton<T> const &other)
{
*this = other;
}
//Destruction
template <typename T>
Singleton<T>::~Singleton(void)
{
}
//Surcharges
template <typename T>
Singleton<T> &Singleton<T>::operator=(Singleton<T> const &other)
{
if (&other != this)
{
m_pInstance = other.m_pInstance;
m_Instance = other.m_Instance;
}
return (*this);
}
//Others
template <typename T>
T *Singleton<T>::GetSingletonPtr(void)
{
if (m_pInstance == NULL)
m_pInstance = new T();
return (m_pInstance);
}
template <typename T>
T &Singleton<T>::GetSingleton(void)
{
return (m_Instance);
}
template <typename T>
void Singleton<T>::DestroySingleton(void)
{
if (m_pInstance != NULL)
{
delete (m_pInstance);
m_pInstance = NULL;
}
}
}
然后,我在单例类'TestSingleton'的构造函数中使用日志'constructor:toto'编写了以下代码。
#include <iostream>
#include <Singleton.hpp>
class TestSingleton : public core::Singleton<TestSingleton>
{
friend class core::Singleton<TestSingleton>;
private:
TestSingleton(void)
{
std::cout << "constructor:toto" << std::endl;
}
};
class HandleSingleton
{
public:
void Handle()
{
TestSingleton &test = TestSingleton::GetSingleton();
}
};
int main(void)
{
getchar();
return (0);
}
输出如下:
$> constructor:toto
我不明白为什么有引用的变量被初始化,即使初始化这个引用的方法(这里的方法'Handle')没有被调用?
提前感谢您的帮助!
您的Singleton类使用T
的静态实例。这个实例将在程序启动期间,在调用main
之前初始化。
粘贴中的以下代码初始化实例:
//Globals initialization
// […]
template <typename T>
T Singleton<T>::m_Instance = T();
程序调用T
实例的静态初始化,c++标准n3337 § 3.6.2/2规定:
具有静态存储时间(3.7.1)或线程存储的变量持续时间(3.7.2)应在任何其他之前进行零初始化(8.5)初始化开始。
(…)
静态初始化应在任何动态初始化之前执行发生在……
在实现单例类时,通常使用"首次使用时构造"这一习惯用法。
这个习惯用法纠正了静态对象构造顺序上的一些问题(您可以搜索静态初始化顺序惨败)。
只需将静态声明放在getObject方法上。然后在第一次调用该方法后调用构造函数。
Singleton的构造函数必须是私有的
之后,根据定义,Singleton是不可复制的。必须将复制构造函数和操作符=设为私有
相关文章:
- C++ 实现模板单例类时出现链接错误
- 具有非默认构造函数的单例类
- 单例类析构函数无法清理 (SDL_Quit) MinGW
- 如何在单例类中管理变量状态?
- 访问单例类C++时出现问题
- 基于 IOKit 的 kext 驱动程序中的单例类
- 指向抽象模板单例类的指针向量C++?
- C++在单例类中创建类实例时遇到困难
- 如果我这样写,我的单例类会导致什么错误
- 这是一个有效的单例类吗?
- 函数内具有静态变量的单例类(迈耶实现)
- 继承的模板化单例类 c++ 中未定义的构造函数
- 为什么调用单例类 Qt 消息处理程序成员函数会出现错误:缺少参数列表
- C++:单例类设计(错误:未解析的外部符号)
- 构造函数在不同线程中的静态单例类上调用两次
- 如何在自定义单例类中使用log4cplus
- 为什么在C 中创建单例类创建期间静态函数参考静态变量
- 如何在静态单例类中以编程方式从exec方法返回
- 为什么在单例类中私有析构函数
- c++中的静态对象与单例类对象