c++ LNK2019错误,未解析的外部字符

c++ LNK2019 error, unresolved external character

我知道这个错误是什么,它意味着什么,但对于我来说,我找不到问题所在。 (我正在开发一款允许制作模块化设备的游戏,而这正是故障发生的地方。)

据我所知,我有:

-我已经包含了我需要的所有#includes。

-我检查了我的函数以确保它们有定义

-我已确保一切都与 class 的沟通方式相一致

这是一些代码(我现在有 21 种项目类型,所以我将只使用其中的一些):

//这只是这个函数的一部分,但是一路往下都是一样的。这就是故障似乎正在发生的地方。

void Inventory::chooseItem(int tag)
{
switch (tag)
{

    //armor

case '1':
    addArmorBack(makeNewArmor1(holder.back()));
    break;

case '2':
    addArmorBreastplate(makeNewArmor2(holder.back()));
    break;

case '3':
    addArmorStraps(makeNewArmor3(holder.back()));
    break;

//.h的私有区域的相关数据持有者:

vector<ItemPart> holder;
ArmorBack makeNewArmor1(ItemPart held);
ArmorBreastplate makeNewArmor2(ItemPart held);
ArmorStraps makeNewArmor3(ItemPart held);

//项目部件列表

 vector<ArmorBack> armorBackList;
 vector<ArmorBreastplate> armorBreastplateList;
 vector<ArmorStraps> armorStrapsList;

//这是我用来向列表中添加内容的函数示例。每个项目都是相同的功能。

void Inventory::addArmorBack(ArmorBack makeNew)
{
    string name;
    armorBackList.push_back(makeNew);
    name = makeNew.getName();
    addItem(name);
}

//ItemPart class接收数据,然后其他函数使用标签int将数据定向到正确的项目部分:

class ItemPart
{
public:
ItemPart(int attack, int defense, int health, int experienceMult,     int tag, string name);

//setters
void setName();
//getters
int getDefense();
int getAttack();
int getHealth();
int getExperienceMult();
int getTag();
string getName();

private:
string _name;

int _defense;
int _attack;
int _health;
int _experienceMult;
int _tag;
};

//最后,相关项class收到数据:

ArmorBack::ArmorBack(ItemPart crafted)
{

_attack = crafted.getAttack();
_defense = crafted.getDefense(); 
_health = crafted.getHealth();
_experienceMult = crafted.getExperienceMult();
_tag = crafted.getTag();
_name = crafted.getName();
}

编辑: 这是错误文本。对于我实施的每种项目类型,我都有其中之一:

Error 37 error LNK2019: 未解析的外部符号"private: class ArmorBack __thiscall Inventory::makeNewArmor1(class ItemPart)" (?makeNewArmor1@Inventory@@AAE?AVArmorBack@@VItemPart@@@Z) 在函数"public: void __thiscall Inventory::chooseItem(int)" (?chooseItem@Inventory@ @QAEXH@Z) C:\Users\Forresto\Documents\Visual Studio 2012\Projects\game challenge ascii\game challenge ascii\Inventory.obj game challenge ascii

就因为你定义了

ArmorBack makeNewArmor1(ItemPart held);

class 成员函数,在头文件中,并不意味着这个成员函数会凭空出现。它只是声明的,并且必须在某个翻译单元(.cpp 文件)中定义。 makeNewArmor1()是从chooseItem()调用的,所以你必须在某处定义这个成员函数。

您发布的任何内容都表明此成员函数是在任何地方定义的。如果它在某些翻译单元中定义,则无法正确 linked。您显示的 link 错误:

Error 37 error LNK2019: unresolved external symbol "private: class
ArmorBack __thiscall Inventory::makeNewArmor1(class ItemPart)"
(?makeNewArmor1@Inventory@@AAE?AVArmorBack@@VItemPart@@@Z) referenced
in function "public: void __thiscall Inventory::chooseItem(int)" 

几乎不言自明。的确,C++ 因令人困惑、难以理解的编译错误而臭名昭著。但这不是其中之一。它几乎可以告诉您牛肉是什么:未定义的符号。它还会告诉您哪个符号未定义,以及从哪里引用它。差不多就是这样。其他不需要知道的就在这里。

要么删除对 makeNewArmor1() 的调用,要么在你的一个翻译单元中定义这个方法,或者弄清楚定义这个成员函数的翻译单元是否没有被编译 and/or linked,正确。

您显示的其他 link 错误同上。