开发者

Why won't my C++ program link when my class has static members?

I have a little class called Stuff that I want to store things in. These things are a list of type int. Throughout my code in whatever classes I use I want to be able to access these things inside the Stuff class.

Main.cpp:

#include "Stuff.h"

int main()
{
    Stuff::things.push_back(123);
    return 0;
}

Stuff.h:

#include <list>

class Stuff
{
public:
    static list<int> things;
};

but I get some build errors with this code:

error LNK2001: unresolved external symbol "public: static class std::list<int,class std::allocator<int> > Stuff::things" (?things@Stuff@@2V?$list开发者_JS百科@HV?$allocator@H@std@@@std@@A) Main.obj CSandbox

fatal error LNK1120: 1 unresolved externals C:\Stuff\Projects\CSandbox\Debug\CSandbox.exe CSandbox

I am a C# guy, and I am trying to learn C++ for a side project. I think that I don't understand how C++ treats static members. So please explain what I have got wrong here.


Mentioning a static member in a class declaration is a declaration only. You must include one definition of the static member for the linker to hook everything up properly. Normally you would include something like the following in a Stuff.cpp file:

#include "Stuff.h"

list<int> Stuff::things;

Be sure to include Stuff.cpp in your program along with Main.cpp.


Static data members have to be defined outside class declarations, much like methods.

For example:

class X {
    public:
        static int i;
};

Must also have the following:

int X::i = 0; // definition outside class declaration


Stuff::things is only declared, but it is not defined.

please use:

// Stuff.cpp
#include "Stuff.h"

std::list<int> Stuff::things;

Added: it is also a good practice to protect your header files against multiple inclusion:

// Stuff.h
#ifndef STUFF_H_
#define STUFF_H_

#include <list>

class Stuff {
    public:
       static std::list<int> things;
};

#endif


Just For your Information, why this works is that in C++ all global variables (including static global) are created before the execution of the main function begins.


Static member have to be declared in the class but defined in the unit (cpp file) where it is really located.

The only exception is in case the class is template: in this case you have to define the member outside the class, but you have to provide it too with the class declaration, in the header file.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜