下面的代码被用作交易函数的一部分,在该函数中显示了一个属性列表,并在他们想要交易的属性中使用的类型。
当用户输入了一个不存在的属性(捕获块被运行),然后输入一个有效的属性时,'访问违规读取位置错误'发生在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);
}
}
***
}
你的异常被抛出,因为你的循环在你的getOwnedProperty()函数中没有找到任何与其if()语句匹配的内容。用 == 操作符比较字符串值是一个错误,所以你应该使用 string::compare() 方法。请在这里阅读如何使用它。https:/www.geeksforgeeks.orgstdstringcompare-in-c