C ++单例模式代码无法运行,我不知道为什么?

时间:2017-07-19 04:21:35

标签: c++ c++11 c++14

这是我的单例模型代码:

#include <iostream>
using namespace std;
class CSingleton  
{  
private:  
    CSingleton()
    {  
    }  
    static CSingleton *m_pInstance;  
public:  
    static CSingleton * GetInstance()  
    {  
        if(m_pInstance == NULL)  
            m_pInstance = new CSingleton();  
        return m_pInstance;  
    }  
};  
int main() {
    CSingleton* p1 = CSingleton::GetInstance();
    return 0;
}

当我运行此代码时,出现以下错误apper undefined reference to CSingleton::m_pInstance,我不知道我错在哪里,我只想写一个模型。有人帮我吗?

3 个答案:

答案 0 :(得分:2)

在课堂之外(以及main之外),你需要定义该变量而不仅仅是声明它(就像你的班级一样) :

CSingleton *CSingleton::m_pInstance = nullptr;

您还注意到我使用了nullptr而不是NULL0 - 这是在现代C ++编译器中执行空指针的更好方法。< / p>

以下完整程序显示了如何执行此操作:

include <iostream>

class CSingleton {
    private:
        static CSingleton *m_pInstance;
        CSingleton() {
            std::cout << "Instantiating\n";
        }
    public:
        static CSingleton *GetInstance() {
            if (m_pInstance == nullptr) {
                m_pInstance = new CSingleton();
            }
            std::cout << "Delivering\n";
            return m_pInstance;
        }
};
CSingleton *CSingleton::m_pInstance = nullptr;

int main() {
    CSingleton* p1 = CSingleton::GetInstance();
    CSingleton* p2 = CSingleton::GetInstance();
    CSingleton* p3 = CSingleton::GetInstance();
    return 0;
}

正如所料,它输出:

Instantiating
Delivering
Delivering
Delivering

答案 1 :(得分:2)

如果您真的想使用单身,请使用Meyers&#39;之一:

class CSingleton  
{  
private:  
    CSingleton() = default;
    CSingleton(const CSingleton&) = delete;
    CSingleton& operator=(const CSingleton&) = delete;
public:  
    static CSingleton& GetInstance()
    {  
        static CSingleton instance;
        return instance;  
    }  
};

答案 2 :(得分:0)

您需要初始化您的单例类的静态数据成员。这可以在课外进行,如下所示 -

CSingleton *CSingleton::m_pInstance = nullptr;

是的,如果你真的想使用最好的Singleton版本,你应该按照 @ Jarod42 的建议使用Meyer的版本。因为这是线程安全的,这是低延迟系统的首选设计。