2013-04-06 95 views
4

我知道有关于单身人士的一百万个问题和答案,但我似乎无法找到解决方案。所以运行的否决票的风险,这是我的问题:C++单身使用:编译器抱怨私有构造函数

我想用从安德烈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; 
} 

test:

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

有什么不好呢?我坚持......

class
+0

唉,这就是如果你在早餐前发布问题会发生什么......在原始代码中,我有公开说明符。我会在一分钟后发布“真实”的问题。 – steffen 2013-04-06 08:03:34

回答

4

默认情况下,类的成员是私人的。要访问你的单,你需要Singleton::Instance市民:

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

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

请注意,这不是构造函数(如您在您的标题说的),这是一个应该参考回到单身的静态成员函数。

3

默认的访问是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
class S 
{ 
    public: 
     static S& getInstance() 
     { 
      static S instance; 

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

另外,不要让你的其他析构函数私有。

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

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

};