C++ 在函数调用和函数完成后,游戏完全崩溃

标签 c++ function vector inventory

我在学校的 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);

其次,我倾向于为 addToInventoryremoveFromInventorylistInventory 使用三个独立函数。

这似乎有点......不直观......必须记住 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/

相关文章:

c++ - 没有图书馆的 boost

c++ - 带有 if 条件的编译器错误

java - 从主类上的函数调用外部类对象

c - 为什么编译器警告并忽略对我的函数 strlen 的调用?

c++ - 通过指针 vector 累加

c++ - vector 大小受 std::cin 影响?

c++ - 使用Eigen::FFT执行FFT时的频率

c++ - 在 c++ 中从 long long 转换为 int 和其他方式

sql - excel中的东西功能

Java日期周期比较