为什么我必须在此行声明类型

时间:2014-08-09 06:47:52

标签: c++ singleton

我正在读一本关于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;

3 个答案:

答案 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)

简短的回答是,任何声明的类型必须与其定义的类型相匹配。如果你不理解声明和定义之间的区别,我建议你做一些研究和阅读。