C ++ Singleton用法:编译器抱怨私有构造函数

时间:2013-04-06 07:51:21

标签: c++ design-patterns singleton

我知道有一百万个关于单身人士的问题和答案,但我似乎无法找到解决方案。所以冒着负面投票的风险,这是我的问题:

我想使用Andrei Alexandrescu的“现代C ++设计:

”中的单例实现

头:

class Singleton
{
    static Singleton& Instance();
  private:
    Singleton(){};
    Singleton(const Singleton&){};
    Singleton& operator=(const Singleton&){};
    ~Singleton(){};
};

实现:

#include "s.hh"

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

试验:

#include "s.hh"

int main(void)
{
    Singleton& single = Singleton::Instance();
    return 0;
}

现在,

$g++ A.cc s.cc  && ./a.out 
In file included from A.cc:1:0:
s.hh: In function ‘int main()’:
s.hh:3:19: error: ‘static Singleton& Singleton::Instance()’ is private
 static Singleton& Instance();
               ^
A.cc:6:42: error: within this context
  Singleton& single = Singleton::Instance();
                                      ^

这有什么问题?我被卡住了......

5 个答案:

答案 0 :(得分:4)

默认情况下,班级成员是私人的。要访问您的单身人士,您需要将Singleton::Instance公开:

class Singleton
{
  // here!
  public:
    static Singleton& Instance();

  private:
    Singleton(){};
    Singleton(const Singleton&){};
    Singleton& operator=(const Singleton&){};
    ~Singleton(){};
};

请注意,这不是构造函数(正如您在标题中所述),它是静态成员函数,应该返回对单例的引用。

答案 1 :(得分:3)

class的默认访问权限为private,因此您需要明确Instance()方法public

class Singleton
{
 public:
    static Singleton& Instance();
 private:
   // as before
....
};

或者,您可以使用struct,其默认访问说明符是公共的:

struct Singleton
{
    static Singleton& Instance(); // public
  private:
    Singleton(){};
    Singleton(const Singleton&){};
    Singleton& operator=(const Singleton&){};
    ~Singleton(){};
};

答案 2 :(得分:3)

类的默认访问说明符为private。在public访问说明符下添加方法。

public:
    static Singleton& Instance();

好读:
What are access specifiers? Should I inherit with private, protected or public?

答案 3 :(得分:2)

class S
{
    public:
        static S& getInstance()
        {
            static S    instance; 

            return instance;
        }
    private:
            // other stuff here
};

答案 4 :(得分:0)

另外,不要将其他析构函数设为私有。

class Singleton
{
  // here!
  public:
    static Singleton& Instance();
    ~Singleton(){};

  private:
    Singleton(){};
    Singleton(const Singleton&){};
    Singleton& operator=(const Singleton&){};

};