4

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

我想使用 Andrei Alexandrescu 的 Modern C++ Design 这个单例实现:

标题:

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();
                                      ^

那有什么问题?我被困住了...

4

5 回答 5

4

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

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

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

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

于 2013-04-06T07:54:00.243 回答
3

a 的默认访问权限classprivate,因此您需要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(){};
};
于 2013-04-06T07:53:49.023 回答
3

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

public:
    static Singleton& Instance();

好读:
什么是访问说明符?我应该以私有、受保护还是公共继承?

于 2013-04-06T07:54:04.060 回答
2
class S
{
    public:
        static S& getInstance()
        {
            static S    instance; 

            return instance;
        }
    private:
            // other stuff here
};
于 2013-04-06T07:55:22.860 回答
0

也不要将您的其他析构函数设为私有。

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

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

};
于 2013-04-06T11:57:18.003 回答