undefined reference error due to use of static variables [duplicate]

╄→гoц情女王★ 提交于 2019-12-24 04:59:21

问题


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.


回答1:


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



回答2:


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

Timing* Timing::_singleInstance = NULL;



回答3:


  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;
    



回答4:


  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)




回答5:


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.



来源:https://stackoverflow.com/questions/3672088/undefined-reference-error-due-to-use-of-static-variables

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!