请解释一个特性单例(C++)
Please, Explain a one of feature singleton(C++)
例如,我有以下类:
class singelton
{
public:
static singelton* Instance()
{
if (m_pInstance == 0)
{
m_pInstance = new singelton();
}
return m_pInstance;
}
void setData(std::string input) { data = input; }
void getData() const { std::cout << data << std::endl; }
private:
singelton() {}
~singelton() {}
static singelton* m_pInstance;
std::string data;
};
typedef singelton s;
//what is this? Why need a singleton name? I mean "singelton*".
singelton* singelton::m_pInstance = 0;
int main(int argc, char** argv)
{
s.Instance()->setData("Something...");
s.Instance()->getData();
return 0;
}
什么是singelton* singelton::m_pInstance = 0;
?此函数为单例实例分配零/null,但为什么需要使用singleton*
?该赋值类似于函数,但用作赋值。
静态数据成员不是给定类类型的对象的一部分;它们是独立的对象。因此,静态数据成员的声明不被视为定义。所以静态成员必须在类声明之外定义。
在您的示例中:
singelton *
是一类成员singleton::
是类名(类似于命名空间)m_pInstance
为成员名称
p.S.:因为C++中默认情况下静态变量初始化为0,所以不需要显式地将m_pInstance
设置为0
(或NULL
)。只有定义就足够了:
singelton * singelton::m_pInstance;
什么是
singelton* singelton::m_pInstance = 0;
?
它是静态成员变量m_pInstance
的初始化程序,将指针静态初始化为null。singelton*
(指向singelton的指针)是变量的类型;singlelton::m_pInstance
是变量的(限定的)名称;并且CCD_ 13是初始化器。
此函数为单例实例分配零/null,但为什么需要使用
singleton*
?
否,它将指针初始化为null;它还没有指向任何东西。当有人第一次调用Instance()
时,将创建对象本身,并更新指针以指向它。它是一个指针,这样对象本身就可以在第一次需要时创建,而不是在程序启动期间的某个任意点创建——这被称为"惰性初始化"。
注意,在C++中,没有办法正确地实现Singleton反模式。这个特定的实现存在对象泄漏和线程不安全的问题。我强烈建议您去掉它:只需在适当的位置实例化对象,其生存期比使用它的对象长,并将引用传递给需要它的对象。
使用
Singleton::Instance()->setData("Hello");
和
Singleton::Instance()->getData();
类只能有一个实例,因此称为singleton
Singleton::Instance
允许您访问
singelton* singelton::m_pInstance = 0;
初始化它,当您第一次使用它时,会创建单例
- 为什么在单例中,检查类==空?
- C++ 实现模板单例类时出现链接错误
- 在类中存储单例的指针
- C++中的单例实现在调用 getInstance 函数时不会产生相同的类实例
- 具有非默认构造函数的单例类
- 使用 std::call_once 实现类似单例的功能
- 为什么单例使用指针而不是引用?
- 提升单例池release_memory vs purge_memory
- 具有 QObject 继承的单例 - Qt
- 单例类析构函数无法清理 (SDL_Quit) MinGW
- C++单例,不会为此文档加载任何符号
- 使用 CRTP 实现单例
- C++单例模板类使我的程序崩溃
- 初学者C++线程安全单例设计
- 派生类是单例是否是一种好的做法
- _CrtIsValidHeapPointer(块)错误在应用单例-帕特恩后退出主窗口时引发
- 在这种单例实施中,是否可以对两个商店重新排序?
- 这是MSVC 2013中具有共享PTR的单例的正确实现吗?
- C++ 单例实现 迈耶与call_once
- 如何析构单例实例,或者为什么以下代码适用于析构函数?