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

Ash*_*ban 2 c++ static static-members

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

Timing.h

class Timing {

public:
    static Timing *GetInstance();
private:
    Timing();
    static Timing *_singleInstance;
};
Run Code Online (Sandbox Code Playgroud)

Timing.cpp

 #include "Timing.h"

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

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

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

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

Kle*_*ist 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;
}
Run Code Online (Sandbox Code Playgroud)