C++ 对Singleton::Singleton()的未定义引用
我试图从中获得第一个基本的单例示例 工作,但这让我很难堪 此代码使用C++ 对Singleton::Singleton()的未定义引用,c++,design-patterns,singleton,C++,Design Patterns,Singleton,我试图从中获得第一个基本的单例示例 工作,但这让我很难堪 此代码使用g++-c Singleton.cpp干净地编译: class Singleton { public: static Singleton* Instance(); protected: Singleton(); private: static Singleton* _instance; }; Singleton* Singleton::_instance = 0; Singleton* Singlet
g++-c Singleton.cpp干净地编译:
class Singleton {
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* _instance;
};
Singleton* Singleton::_instance = 0;
Singleton* Singleton::Instance() {
if (_instance == 0) {
_instance = new Singleton;
}
return _instance;
}
但是,当我添加一个骨架main()并使用g++Singleton.cpp
编译时,我得到了对“Singleton::Singleton()”的未定义引用。
我遗漏了什么?您从未为我添加定义
Singleton();
在Singleton*Singleton::Instance()中使用
_instance = new Singleton;
通常,您应该并且可以像以下那样布局单例:
class Singleton {
public:
static Singleton* Instance() { static Singleton s; return &s; }
Singleton(const Singleton&) = delete;
void operator=(const Singleton&) = delete;
private:
Singleton() = default;
};
你从来没有给它加过定义
Singleton();
在Singleton*Singleton::Instance()中使用
_instance = new Singleton;
通常,您应该并且可以像以下那样布局单例:
class Singleton {
public:
static Singleton* Instance() { static Singleton s; return &s; }
Singleton(const Singleton&) = delete;
void operator=(const Singleton&) = delete;
private:
Singleton() = default;
};
你声明了一个构造函数(你不需要),但遗漏了它的定义。@DieterLücking“你不需要”这不完全正确。至少它应该是私有的ῥεῖ 当然-该死的反pattern@DieterL我知道这是一件愚蠢的基本事情。干杯。@πάνταῥεῖ 虽然这可能是一个骗局,但它也是教科书上的典型例子。我猜有些人可能也有同样的问题。你声明了一个构造函数(你不需要),但遗漏了它的定义。@DieterLücking“你不需要”这不完全正确。至少它应该是私有的ῥεῖ 当然-该死的反pattern@DieterL我知道这是一件愚蠢的基本事情。干杯。@πάνταῥεῖ 虽然这可能是一个骗局,但它也是教科书上的典型例子。我猜一些人可能也有同样的问题。答案很好,我肯定会使用这个片段。但它与教科书中的示例有点偏离,也许您可以添加一点关于使用默认构造函数的内容?@DanielSingleton()=default
基本上只是一种C++11编写Singleton(){}
的方法。If强制编译生成Singleton(){}
;谢谢你,内森!那么,删除是什么意思?这是什么语法糖?@Tim它告诉编译器该函数不存在,使用它将生成一个不错的编译器错误,表示您试图使用已删除的函数。在C++11之前的日子里,您必须将它声明为私有,而不是实现它,关于使用它的错误消息也没有那么好。Is\u instance=new Singleton代码>与\u instance=new Singleton()相同代码>?哪一个是首选的?很好的答案,我肯定会使用这个片段。但它与教科书中的示例有点偏离,也许您可以添加一点关于使用默认构造函数的内容?@DanielSingleton()=default
基本上只是一种C++11编写Singleton(){}
的方法。If强制编译生成Singleton(){}
;谢谢你,内森!那么,删除是什么意思?这是什么语法糖?@Tim它告诉编译器该函数不存在,使用它将生成一个不错的编译器错误,表示您试图使用已删除的函数。在C++11之前的日子里,您必须将它声明为私有,而不是实现它,关于使用它的错误消息也没有那么好。Is\u instance=new Singleton代码>与\u instance=new Singleton()相同代码>?哪一个比较好?