Нарушение доступа к месту чтения при использовании рекурсии? - PullRequest
0 голосов
/ 03 мая 2020

Приведенный ниже код используется как часть торговой функции, в которой отображается список свойств и используемые типы в свойствах, которыми они хотят торговать.

«Ошибка определения местоположения при нарушении прав доступа» возникает в переменной propertyName, когда пользователь вводит несуществующее свойство (выполняется блок catch), а затем вводит допустимое свойство.

Я не понимаю, почему он выдает эту ошибку, я думаю, это то, что я сделал в блоке catch с 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);
        }

    }

***

}

1 Ответ

0 голосов
/ 03 мая 2020

Ваше исключение выдается, потому что ваш l oop не находит соответствия с его оператором if () в вашей функции getOwnedProperty (). Ошибочно сравнивать строковые значения с оператором ==, поэтому вы должны использовать метод string :: compare (). Прочтите о том, как использовать его здесь: https://www.geeksforgeeks.org/stdstringcompare-in-c/

...