Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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++ 对Singleton::Singleton()的未定义引用_C++_Design Patterns_Singleton - Fatal编程技术网

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我知道这是一件愚蠢的基本事情。干杯。@πάνταῥεῖ 虽然这可能是一个骗局,但它也是教科书上的典型例子。我猜一些人可能也有同样的问题。答案很好,我肯定会使用这个片段。但它与教科书中的示例有点偏离,也许您可以添加一点关于使用默认构造函数的内容?@Daniel
Singleton()=default
基本上只是一种C++11编写
Singleton(){}
的方法。If强制编译生成
Singleton(){}
;谢谢你,内森!那么,删除是什么意思?这是什么语法糖?@Tim它告诉编译器该函数不存在,使用它将生成一个不错的编译器错误,表示您试图使用已删除的函数。在C++11之前的日子里,您必须将它声明为私有,而不是实现它,关于使用它的错误消息也没有那么好。Is
\u instance=new Singleton
\u instance=new Singleton()相同?哪一个是首选的?很好的答案,我肯定会使用这个片段。但它与教科书中的示例有点偏离,也许您可以添加一点关于使用默认构造函数的内容?@Daniel
Singleton()=default
基本上只是一种C++11编写
Singleton(){}
的方法。If强制编译生成
Singleton(){}
;谢谢你,内森!那么,删除是什么意思?这是什么语法糖?@Tim它告诉编译器该函数不存在,使用它将生成一个不错的编译器错误,表示您试图使用已删除的函数。在C++11之前的日子里,您必须将它声明为私有,而不是实现它,关于使用它的错误消息也没有那么好。Is
\u instance=new Singleton
\u instance=new Singleton()相同?哪一个比较好?