【发布时间】:2021-05-29 03:50:42
【问题描述】:
我正在尝试用 C++ 开发一个文本冒险,用户可以在其中输入字符串命令(例如“take apple”)。 这是我想出的一个非常天真的代码示例:
# include <iostream>
using namespace std;
class fruit{
public:
string actual_name;
fruit(string name){
actual_name = name;
}
take() {
cout << "You take a " << actual_name << "." << endl;
}
};
fruit returnObjectFromName(string name, fruit Fruits[]){
for(int i = 0; i <= 1; i++){ // to be modified in future depending on Fruits[] in main()
if (Fruits[i].actual_name == name)
return Fruits[i];
}
}
int main(){
string verb;
cout << "Enter verb: ";
cin >> verb;
string object;
cout << "Enter object: ";
cin >> object;
fruit apple("apple");
fruit Fruits[] = { apple }; // to be extended in future
// returnObjectFromName(object, Fruits). ??? ()
}
如果这可能的话,我怎么可能用类似于函数 returnObjectFromName 的方法获得水果方法? 我(独立地)开始使用 Python 进行开发,在那里我至少可以使用 eval(),但据我所知,在 C++ 中这不是一个选项。 我也尝试使用地图,但我没有设法使其与方法一起使用。
谢谢大家的回答。
【问题讨论】:
-
您可能正在寻找
std::map或std::unordered_map -
等等...我可能读错了。
returnObjectFromName(object, Fruits).my_fruit_method();应该可以工作。如果它不适合您,请使用代码示例扩展您的问题描述,准确显示您尝试过的内容,以便我们向您展示如何纠正它。 -
旁注:如果
name无法匹配,returnObjectFromName将无法到达返回语句。这对程序来说是致命的。当一个函数承诺返回一个值时,它必须在每种情况下都返回一个值。 -
旁注:for循环退出条件中的
<=通常是一个错误。例如:注意for(int i = 0; i <= 1; i++)中i的可能值。第一次迭代i为 0。0 i++ 将i增加到 1。1 Fruits[1],所以程序失败了。也许它会大声失败并崩溃或吐出废话。也许它失败得如此悄无声息,以至于您不会立即注意到。也许你几周都没有注意到。也许直到你把程序展示给你的老板,或者在贸易展上,或者自动驾驶汽车没有刹车时,你才注意到。 -
在 C 和 C++ 中,您不能即时创建方法。您可以做的最接近的方法是将术语映射到现有功能。
std::map<std::string, std::function<void ()>>verbs = { { "take", take_function }, { "eat", eat_function } };。然后你可以verb.at(user_action)();调用user_action中字符串的函数。如果user_action不包含已知字符串,at将抛出异常。