我今天早些时候提出了一个关于单身人士的问题,我在理解遇到的一些错误时遇到了一些困难。我有以下代码:
class Timing {
public:
static Timing *GetInstance();
private:
Timing();
static Timing *_singleInstance;
};
#include "Timing.h"
static Timing *Timing::GetInstance() { //the first error
if (!_singleInstance) {
_singleInstance = new Timing(); //the second error
}
return _singleInstance;
}
此代码中有两个错误,我无法弄清楚。
方法GetInstance()
在标头中声明为static。为什么在cpp文件中我必须省略单词static
?它给出了错误:“无法声明成员函数'静态时序* Timing :: GetInstance()'具有静态链接”。写它的正确方法是:
Timing *Timing::GetInstance() { ... }
为什么我不能写_singleInstance = new Timing();
?它给出了错误:“对Timing :: _ singleInstance的未定义引用”。我通过将_singleInstance
定义为cpp文件中的全局变量来解决此错误。
答案 0 :(得分:5)
1:static用于在类声明之外的函数声明/定义时表示“本地链接”。
本地链接意味着特定的函数只能从这个特定文件中的代码引用,而且对于类中的方法没有多大意义。
2:由于您的类声明可以多次包含,因此静态成员的实际存储应该在cpp文件中定义:
#include "Timing.h"
Timing* Timing::_singleInstance;
Timing *Timing::GetInstance() { //the first error
if (!_singleInstance) {
_singleInstance = new Timing(); //the second error
}
return _singleInstance;
}
答案 1 :(得分:2)
参考问题2:您需要在cpp文件的顶部指定静态变量:
Timing* Timing::_singleInstance = NULL;
答案 2 :(得分:1)
static
意味着与它之外的static
完全不同。是的,不是C ++最伟大的设计决定,但是,我们必须忍受它。
我想呜呜声来自链接器,这是因为你已声明该变量但从未定义它,使其成为未定义的引用。只需在.cpp
文件中加入以下行:
Timing* Timing::_singleInstance;
答案 3 :(得分:0)
是的,您必须省略.cpp文件中的静态
你必须在_singleInstance
的某个地方'保留记忆',例如通过在.cpp文件中编写以下内容:
计时*计时:: _ singleInstance = NULL;
(在成员函数的定义之外)
答案 4 :(得分:-1)
在定义中,您需要省略static关键字。因为这是C ++的语法。没什么大的。
修正错误编号1后,错误编号2将自动修复。