为什么在另一个头文件中声明结构会导致LNK2001错误



我正在尝试用c++制作一个基于文本的控制台视频游戏。

我有一个Inventory类,它有一个头和一个源文件。在同一个头文件中,我声明了一个名为STRINGSIZES的结构,它有两个名为name和description的整数成员。它们用于存储显示项目时应使用的长度,或者名称将从哪个长度缩短。头文件"Inventory.h"看起来像这样:

#pragma once
#include <iostream>
struct STRINGSIZES {    //the fixed Size with which Inventory lists will be printed
int name;
int description;
};
class Inventory
{
public:
//some unrelated code
Inventory();
static void setStringSizes(int name, int description);
private:
static STRINGSIZES stringSizes;
};

在Inventory.cpp文件中,我定义了setStringSizes()方法,如下所示:

void Inventory::setStringSizes(int name, int description)
{
stringSizes.name = name;
stringSizes.description = description;
}

在我的Source.cpp主文件中,我首先调用这个方法。

现在,当我试图编译这个时,我得到了错误:

1> Inventory.obj:错误LNK2001:未解析的外部符号"public:static int stringSizeNames::name"(?name@stringSizeNames@@2HA(

1> Inventory.obj:错误LNK2001:未解析的外部符号"public:static int stringSizeNames::description"(?description@stringSizeNames@@2HA(

这里有什么问题?

错误消息引用了一个变量,该变量的声明没有在问题中显示。但我认为这与静态数据成员stringSizes的问题相同。

在类定义中,此数据成员

static STRINGSIZES stringSizes;

是不是定义的声明。

您必须在cpp文件中的类定义之外定义它,例如

STRINGSIZES Inventory::stringSizes;

如果您的编译器支持C++17标准,那么您可以在类定义中以以下方式定义数据成员

class Inventory
{
//...
inline static STRINGSIZES stringSizes = {};
};

最新更新