我有一个名为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 ++如何对待静态成员。所以请在这里解释我的错误。
答案 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文件)中定义。
唯一的例外是在类是模板的情况下:在这种情况下,您必须在类外定义成员,但是您必须在头文件中提供类声明。