Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 单身不工作_C++_Singleton - Fatal编程技术网

C++ 单身不工作

C++ 单身不工作,c++,singleton,C++,Singleton,我已经“按书”编写了这个单例演示程序,但它似乎没有编译。我从编译器那里得到一个链接器错误,该错误与保存单例实例的单例类中的静态变量有关。原因可能是什么 #include <iostream> #include "Singleton.h" //using namespace std; int main() { Singleton * sinObj1 = Singleton::Instance(); sinObj1 -> setInt (3); Sin

我已经“按书”编写了这个单例演示程序,但它似乎没有编译。我从编译器那里得到一个链接器错误,该错误与保存单例实例的单例类中的静态变量有关。原因可能是什么

#include <iostream>
#include "Singleton.h"

//using namespace std;

int main()
{

    Singleton * sinObj1 = Singleton::Instance();
    sinObj1 -> setInt (3);
    Singleton * sinObj2 = Singleton::Instance();

    std::cout << sinObj2 -> getInt() << std::endl;

    return 0;
}

您必须像在
singleton.cpp
文件中那样定义静态
m_singleton
字段:

Singleton::m_instance = NULL;
但我会像这样重写您的Instance()方法:

Singleton* Singleton::Instance()
{
    static Singleton instance;
    return &instance;
}
并删除
m_实例
字段。这样做的好处是,当程序关闭时,您的单例实例将被正确删除。就像现在一样,你的单例实例永远不会被删除,更重要的是,它的析构函数永远不会被调用。因此,如果您决定向Singleton类添加一个(非默认)析构函数,例如清理一些资源,它将不会被调用


我还将返回对singleton的引用,而不是指针,因为它比返回指针(这可能会提示客户端删除singleton实例!)更好地传递所有权语义。

singleton*singleton::m_instance=NULL;编译,但我将使用引用方法。谢谢你的提示!
Building target: SingletonTest

Invoking: MacOS X C++ Linker

g++  -o "SingletonTest"  ./src/Singleton.o ./src/SingletonTest.o   

Undefined symbols for architecture x86_64:

  "Singleton::m_instance", referenced from:

      Singleton::Instance() in Singleton.o

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

make: *** [SingletonTest] Error 1
Singleton::m_instance = NULL;
Singleton* Singleton::Instance()
{
    static Singleton instance;
    return &instance;
}