使用递归时访问违规读取位置?

问题描述 投票:-1回答:1

下面的代码被用作交易函数的一部分,在该函数中显示了一个属性列表,并在他们想要交易的属性中使用的类型。

当用户输入了一个不存在的属性(捕获块被运行),然后输入一个有效的属性时,'访问违规读取位置错误'发生在propertyName变量上。

我不明白它为什么会抛出这个错误,我猜测是我在捕捉块中用getline或者递归做了什么,我无法解决。

玩家交易功能

void player::trade(player &tradePlayer){
    ***

    //code extract
    cout << "What properties would you like from " << tradePlayer.getPlayerName() << " ? (Enter done when finished selecting)" << endl;
    string propertyName;
    vector<properties> theirProperties; 
    int theirCash;
    ws(cin);
    getline(cin, propertyName); //gets property name
    while (propertyName != "done") {
        theirProperties.push_back(tradePlayer.getOwnedProperty(propertyName));
        getline(cin, propertyName); **Access violation appears here**
    }

    ***

玩家类 - getOwnedProperty()

class player
{
public:

***
    //code extract
    properties &getOwnedProperty(string name) {
        try {
            for (int i = 0; i < ownedProperties.size(); i++) {
                if (ownedProperties.at(i).getProperty() == name) {
                    return ownedProperties.at(i);
                }
            }
            throw exception();
        }
        catch (exception){
            cout << "Property name not recognised! Try again." << endl;
            ws(cin);
            getline(cin, name);
            getOwnedProperty(name);
        }

    }

***

}
c++ try-catch access-violation
1个回答
0
投票

你的异常被抛出,因为你的循环在你的getOwnedProperty()函数中没有找到任何与其if()语句匹配的内容。用 == 操作符比较字符串值是一个错误,所以你应该使用 string::compare() 方法。请在这里阅读如何使用它。https:/www.geeksforgeeks.orgstdstringcompare-in-c

© www.soinside.com 2019 - 2024. All rights reserved.