This question already has an answer here:
- static variable link error 2 answers
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.
The method
GetInstance()
is declared in the header as static. Why in the cpp file do I have to omit the wordstatic
? 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() { ... }
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: 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:
Referencing to question 2: You need to specify the static variable at the top of your cpp-file:
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.
static
within a class means something completely different thanstatic
outside of it. Yeah, not the greatest design decision of C++, but, we have to live with it.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:yes, you have to omit the static in the .cpp file
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)