我正在读一本关于C ++单身人士的书
在本书中,有一个示例说明如何编写单例:
// Singleton.h
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* _instance;
};
#endif //~_SINGLETON_H_
这是相应的cpp文件
// Singleton.cpp
#include "Singleton.h"
Singleton* Singleton::_instance = 0; // why do I have to type "Singleton*" at this line?
Singleton::Singleton()
{
cout << "Singleton..." << endl;
}
Singleton* Singleton::Instance()
{
if (_instance == 0)
{
_instance = new Singleton();
}
return _instance;
}
令我困惑的是&#34; Singleton * Singleton :: _ instance = 0;&#34;。
我认为写作&#34; Singleton :: _ instance = 0;&#34;足以让C ++编译器理解。因为我已经宣布&#34;静态Singleton * _instance;&#34;在头文件中。
为什么我必须第二次声明_instance属于Singleton *类型?
我已尝试删除&#34; Singleton *&#34;。删除后,Visual Studio告诉我
&#34;错误C4430:缺少类型说明符 - 假设为int。&#34;
答案 0 :(得分:2)
尽管在其他答案中说的是正确的,但我建议您使用以下实现
Singleton& Singleton::Instance() {
static Singleton theInstance;
return theInstance;
}
关于_instance
变量的声明和定义,不仅这个成语是线程安全的,更少写作。
答案 1 :(得分:0)
嗯,你不会喜欢这个答案,但要点是C ++只需要在所有定义中指定类型(在某些例外情况下,你可以使用auto
)。
在声明和定义函数时需要重复类型的原因相同:
int foo(char);
int foo(char x) {
return x;
}
答案 2 :(得分:-2)
简短的回答是,任何声明的类型必须与其定义的类型相匹配。如果你不理解声明和定义之间的区别,我建议你做一些研究和阅读。