当我的班级有静态成员时,为什么我的C ++程序不会链接?

时间:2009-12-29 21:14:04

标签: c++ static

我有一个名为Stuff的小类,我想把东西存入。这些东西是int类型的列表。在我使用的任何类中的代码中,我希望能够在Stuff类中访问这些内容。

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

但是我在这段代码中遇到了一些构建错误:

  

错误LNK2001:未解析的外部符号“public:static class std :: list&lt; int,class std :: allocator&lt; int&gt;&gt; Stuff :: things”(?thing @ Stuff @@ 2V?$ list @ HV? $ allocator @ H @ std @@@ std @@ A)Main.obj CSandbox

     

致命错误LNK1120:1个未解析的外部C:\ Stuff \ Projects \ CSandbox \ Debug \ CSandbox.exe CSandbox

我是C#家伙,我正在尝试为侧面项目学习C ++。我想我不明白C ++如何对待静态成员。所以请在这里解释我的错误。

5 个答案:

答案 0 :(得分:15)

在类声明中提到静态成员只是声明。您必须为链接器包含静态成员的一个定义以正确挂钩所有内容。通常,您会在Stuff.cpp文件中包含以下内容:

#include "Stuff.h"

list<int> Stuff::things;

请务必在您的计划中加入Stuff.cpp以及Main.cpp

答案 1 :(得分:7)

静态数据成员必须在类声明之外定义,就像方法一样。

例如:

class X {
    public:
        static int i;
};

还必须具备以下条件:

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

答案 2 :(得分:4)

东西::东西只是声明,但没有定义。

请使用:

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

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

已添加:保护您的头文件免受多重包含也是一种很好的做法:

// Stuff.h
#ifndef STUFF_H_
#define STUFF_H_

#include <list>

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

#endif

答案 3 :(得分:2)

仅为了您的信息,为什么这样做是因为在C ++中,所有全局变量(包括静态全局变量)都是在main函数执行开始之前创建的。

答案 4 :(得分:0)

静态成员必须在类中声明,但在它所在的单元(cpp文件)中定义。

唯一的例外是在类是模板的情况下:在这种情况下,您必须在类外定义成员,但是您必须在头文件中提供类声明。