我在学校的 C++ 游戏编程课上制作的一款游戏遇到了问题。出于某种原因,在调用了一个我用来管理基于库存的东西的函数之后,该函数似乎完成并工作了(我认为这是因为我在它的末尾输入了 cout 命令并且它们打印正确,还有函数连续运行两次,它们都运行了),我的整个游戏崩溃了,没有到达下一行。我尝试注释掉函数中的所有代码,但它仍然崩溃。我注释掉了函数调用并且它起作用了,但我仍然不知道它有什么问题。我将放置函数的代码和我进行调用的部分:
string inventoryFunction(int h, string ab)
{
if(h == 1)
inventory.push_back(ab);
else
if(h == 2)
{
for(int i=0; i < inventory.size(); i++)
{
if(inventory[i] == ab)
inventory[i].erase();
}
}
else
if(h == 3)
{
cout << inventory[0];
for(int i=1; i < inventory.size(); i++)
cout << ", " << inventory[i];
}
}
函数调用:
if(answer.find("village") != string::npos)
{
cout << endl;
cout << "While looking around your village,\nyou found a stone sword and a cracked wooden shield!" << endl;
inventoryFunction(1, "stone sword");
inventoryFunction(1, "cracked wooden shield");
cout << "Would you like to set off on your adventure now?" << endl;
cin >> answer2;
capitalizeLower(answer2);
最佳答案
不确定是否有任何可能导致崩溃的情况,我的建议是在调试器中单步执行您的代码以查看它崩溃的位置。错误很可能出现在完全不同的某个地方,并且它只是因修改 vector 的函数调用而加剧。
不幸的是,这就是错误的本质,如果不仔细观察,你永远无法真正分辨出它们实际上来自哪里:-)
但是, 我想指出一些代码问题。
首先,关于:
inventory[i].erase();
这并不像您认为的那样。 inventory[i]
是 vector 中的字符串,因此它只是删除字符串内容。
如果你想从 vector 中删除字符串,你需要这样的东西:
inventory.erase (inventory.begin() + i);
其次,我倾向于为 addToInventory
、removeFromInventory
和 listInventory
使用三个独立函数。
这似乎有点......不直观......必须记住 h
的神奇值才能实现你想做的事情,并且除了这三个用例之外没有真正的共性访问 inventory
vector (这还不足以将它们组合到同一个成员函数中)。
最重要的是,您的函数似乎返回一个 string
但您没有实际的 return
语句,事实上,您的三个用例都没有函数需要传回任何内容。
签名最好是:
void inventoryFunction(int h, string ab)
就上面的第二点和第三点而言,我可能会这样说:
void addToInventory (string item) {
inventory.push_back(ab);
}
void removeFromInventory (string item) {
for (int i = 0; i < inventory.size(); i++) {
if (inventory[i] == ab) {
inventory.erase (inventory.begin() + i);
break;
}
}
void listInventory () {
cout << inventory[0];
for (int i = 1; i < inventory.size(); i++)
cout << ", " << inventory[i];
}
您可能还想研究专门为第二个和第三个函数使用迭代器,而不是手动使用 i
迭代集合。
它将为您节省一些代码并变得更加“C++ic”,“Pythonic”概念的 C++ 版本,我希望它能流行起来并让我出名:-)
关于C++ 在函数调用和函数完成后,游戏完全崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25777766/