我知道有一百万个关于单身人士的问题和答案,但我似乎无法找到解决方案。所以冒着负面投票的风险,这是我的问题:
我想使用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();
^
这有什么问题?我被卡住了......
答案 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&){};
};