2

我今天早些时候问了一个关于单例的问题,我在理解我遇到的一些错误时遇到了一些困难。我有以下代码:

计时.h

class Timing {

public:
    static Timing *GetInstance();
private:
    Timing();
    static Timing *_singleInstance;
};

时序.cpp

 #include "Timing.h"

 static Timing *Timing::GetInstance() {  //the first error
    if (!_singleInstance) {
        _singleInstance = new Timing();  //the second error
    }
    return _singleInstance;
}

这段代码中有两个我无法弄清楚的错误。

  1. 该方法GetInstance()在标头中声明为静态。为什么在 cpp 文件中我必须省略这个词static?它给出了错误:“不能声明成员函数'static Timing * Timing::GetInstance()'具有静态链接”。正确的写法是:

    Timing *Timing::GetInstance() { ... }  
    
  2. 为什么我不能写_singleInstance = new Timing();?它给出了错误:“对 Timing::_singleInstance 的未定义引用”。_singleInstance我通过在 cpp 文件中定义为全局 var解决了这个错误。

4

5 回答 5

5

1:当用于类声明之外的函数声明/定义时,静态表示“本地链接”。

本地链接意味着特定函数只能从该特定文件内的代码中引用,这对于类中的方法没有多大意义。

2:由于您的类声明可以包含多次,因此静态成员的实际存储应在 cpp 文件中定义:

#include "Timing.h"

Timing* Timing::_singleInstance;

Timing *Timing::GetInstance() {  //the first error
    if (!_singleInstance) {
        _singleInstance = new Timing();  //the second error
    }
    return _singleInstance;
}
于 2010-09-08T21:39:53.157 回答
2

参考问题2:您需要在cpp文件的顶部指定静态变量:

Timing* Timing::_singleInstance = NULL;
于 2010-09-08T21:38:59.183 回答
1
  1. static在一个类中意味着与它之外完全不同static的东西。是的,这不是 C++ 最伟大的设计决策,但是,我们必须忍受它。

  2. 我想抱怨来自链接器,这是因为您已经声明了该变量但从未定义它,使其成为未定义的引用。只需在您的.cpp文件中添加如下行:

    Timing* Timing::_singleInstance;
    
于 2010-09-08T21:40:12.030 回答
0
  1. 是的,你必须省略 .cpp 文件中的静态

  2. 您必须为_singleInstance某处“保留内存”,例如通过在 .cpp 文件中写入以下内容:

    时间 *Timing::_singleInstance = NULL;

(在成员函数的定义之外)

于 2010-09-08T21:38:26.510 回答
-1

在定义中,您需要省略 static 关键字。因为那是 C++ 的语法。没什么大不了的。

一旦您修复了错误编号 1,错误编号 2 将自动修复。

于 2010-09-08T21:39:43.157 回答