为什么这个单例实现不能编译?

时间:2013-11-15 19:11:16

标签: c++ design-patterns singleton

我需要单例实现而不使用动态内存分配。我试图像这样实现它:

// Singleton.hpp

class Singleton
{
    public:
    static Singleton& GetInstance();

    private:
    Singleton();
    static Singleton& Instance;
};

// Singlton.cpp

Singleton& Singleton::GetInstance()
{
    return Singleton::Instance;
}

Singleton::Singleton()
{
}

正如我所说,这不会编译。我阅读了很多文章,我尝试以不同的方式初始化static Singleton& Instance,但我得到的只是一个新的编译错误。为什么这不起作用?如何在不使用动态内存分配的情况下实现单例模式?

4 个答案:

答案 0 :(得分:2)

您还需要声明GetInstance方法静态,否则您只能在现有对象上调用它 - 并且您无法创建现有对象,因为构造函数是私有的。

P.S。而不是将实例创建为类的静态成员,您可以将其设置为GetInstance中的静态局部变量。

P.P.S。我刚刚注意到你的Instance变量是一个你没有初始化的引用 - 这也不起作用。这是我的版本:

Singleton & GetInstance()
{
    static Singleton Instance;
    return Instance;
}

答案 1 :(得分:0)

您对Instance的定义不应与标题中的Singleton& Instance;类似。它必须是Singleton Instance;,因为它不是引用而是对象。

您已在标头中声明Singleton::Instance但未在源中定义它。您需要将Singleton Singleton::Instance;放在源文件中。需要在源文件中定义非常量静态对象。

您需要将getInstance方法声明为静态,这样您就不需要实际的对象来调用它。如果是静态的,您可以使用Singleton::getInstance();来调用它。

答案 2 :(得分:0)

这样:

class Singleton
{
    public:
        static Singleton& getInstance();
        ~Singleton();

    private:
        Singleton();
        Singleton(Singleton&); // don't implement
        void operator=(const Singleton&); // don't implement
};


#include "singleton.hpp"

Singleton& Singleton::getInstance()
{
    static Singleton instance;
    return instance;
}

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

编辑:

按照您的“OPP方式”执行此操作,您只需初始化instance变量:

class Singleton
{
    public:
        static Singleton& getInstance();
        ~Singleton();

    private:
        Singleton();
        Singleton(Singleton&); // don't implement
        void operator=(const Singleton&); // don't implement
        static Singleton instance;
};

Singleton Singleton::instance;

Singleton& Singleton::getInstance()
{
    return instance;
}

Singleton::Singleton()
{
    std::cout << "ctor" << std::endl; 
}

Singleton::~Singleton()
{
}

用此测试:

int main() {
    Singleton& s = Singleton::getInstance().getInstance();
    s.getInstance();
}

构造函数只会被调用一次......但是这样你就失去了懒惰的初始化。

答案 3 :(得分:0)

这就是我为我的单身人士所做的事情:

我在班上添加了一个数据成员static int Count ;

所以现在我有:

声明static Singleton::Count = 0;

和构造函数:

 Singleton()
{
 Count++;
}

我的实例是:

static Singleton GetInstance() 
    {
       Singleton obj;

    if ( Count == 1)

     return obj;

    }