请解释一个特性单例(C++)

Please, Explain a one of feature singleton(C++)

本文关键字:单例 C++ 一个 解释      更新时间:2023-10-16

例如,我有以下类:

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;

初始化它,当您第一次使用它时,会创建单例