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 错误同上。
我知道这个错误是什么,它意味着什么,但对于我来说,我找不到问题所在。 (我正在开发一款允许制作模块化设备的游戏,而这正是故障发生的地方。)
据我所知,我有:
-我已经包含了我需要的所有#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 错误同上。