undefined reference error due to use of static var

2019-07-22 02:14发布

This question already has an answer here:

I asked a question earlier today about singletons, and I'm having some difficulties understanding some errors I encountered. I have the following code:

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;
}

There are two errors in this code which I can't figure out.

  1. The method GetInstance() is declared in the header as static. Why in the cpp file do I have to omit the word static? It gives the error: "cannot declare member function ‘static Timing* Timing::GetInstance()’ to have static linkage". The correct way to write it is:

    Timing *Timing::GetInstance() { ... }  
    
  2. Why can't I write _singleInstance = new Timing();? It gives the error: "undefined reference to Timing::_singleInstance". I solved this error by defining _singleInstance as a global var in the cpp file.

5条回答
我命由我不由天
2楼-- · 2019-07-22 02:55

1: static means "local linkage" when used for a function declaration/definition outside a class-declaration.

Local linkage means that the particular function can only be referenced from code inside this particular file, and that doesn't make much sense with a method in a class.

2: Since your class declaration can be included multiple times, the actual storage for the static member should be defined in the cpp-file:

#include "Timing.h"

Timing* Timing::_singleInstance;

Timing *Timing::GetInstance() {  //the first error
    if (!_singleInstance) {
        _singleInstance = new Timing();  //the second error
    }
    return _singleInstance;
}
查看更多
兄弟一词,经得起流年.
3楼-- · 2019-07-22 03:09

Referencing to question 2: You need to specify the static variable at the top of your cpp-file:

Timing* Timing::_singleInstance = NULL;
查看更多
唯我独甜
4楼-- · 2019-07-22 03:11

In the definition, you need to omit the static keyword. Its because that's teh syntax of C++. Nothing big.

Once you fix error number 1, error number 2 will be fixed automatically.

查看更多
兄弟一词,经得起流年.
5楼-- · 2019-07-22 03:20
  1. static within a class means something completely different than static outside of it. Yeah, not the greatest design decision of C++, but, we have to live with it.

  2. I imagine the whining comes from the linker, and it's because you have declared that variable but never defined it, making it an undefined references. Just add in your .cpp file a line like:

    Timing* Timing::_singleInstance;
    
查看更多
叼着烟拽天下
6楼-- · 2019-07-22 03:20
  1. yes, you have to omit the static in the .cpp file

  2. You'll have to 'reserve memory' for _singleInstance somewhere, e.g. by writing the following in the .cpp file:

    Timing *Timing::_singleInstance = NULL;

(outside the definition of the member functions)

查看更多
登录 后发表回答