class 成员函数中静态变量的定义

definition of static variable inside a class member function

我正在学习单例设计模式并遇到了这段代码

class Singleton
{
    private:
        static Singleton * pinstance_;
        static std::mutex mutex_;
    protected:
        static Singleton *GetInstance(const std::string& value);
};


Singleton* Singleton::pinstance_{nullptr}; //can this line be removed?
std::mutex Singleton::mutex_; //can this line be removed?

Singleton *Singleton::GetInstance(const std::string& value)
{
    std::lock_guard<std::mutex> lock(mutex_);
    if (pinstance_ == nullptr)
    {
        pinstance_ = new Singleton(value);
    }
    return pinstance_;
}

因为pinstance_ mutex_都是Singletonclass的成员,它们可以通过GetInstance方法访问。所以我的问题是:这两个定义行可以去掉吗?

不,它们不能被移除,但它们可以移动到方法的局部静态变量中。

class Singleton
{
    protected:
        static Singleton *GetInstance(const std::string& value);
};

Singleton *Singleton::GetInstance(const std::string& value)
{
    static Singleton* pinstance_{nullptr};
    static std::mutex mutex_;

    std::lock_guard<std::mutex> lock(mutex_);
    if (pinstance_ == nullptr)
    {
        pinstance_ = new Singleton(value);
    }
    return pinstance_;
}

另请注意,初始化静态变量不需要守卫。编译器为你做。 局部静态变量初始化在C++11中是线程安全的吗? [复制]

Singleton *Singleton::GetInstance(const std::string& value)
{
    static Singleton* pinstance_ = new Singleton(value);
    return pinstance_;
}