由于使用静态变量而导致未定义的引用错误

时间:2010-09-08 21:35:00

标签: c++ static static-members

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

Timing.h

class Timing {

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

Timing.cpp

 #include "Timing.h"

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

此代码中有两个错误,我无法弄清楚。

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

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

5 个答案:

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

    一个类中的
  1. static意味着与它之外的static完全不同。是的,不是C ++最伟大的设计决定,但是,我们必须忍受它。

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

    即可
    Timing* Timing::_singleInstance;
    

答案 3 :(得分:0)

  1. 是的,您必须省略.cpp文件中的静态

  2. 你必须在_singleInstance的某个地方'保留记忆',例如通过在.cpp文件中编写以下内容:

    计时*计时:: _ singleInstance = NULL;

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

答案 4 :(得分:-1)

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

修正错误编号1后,错误编号2将自动修复。