我试图找到一种方法来调用对象的成员,但使用用户输入来确定哪个对象。所以,我有 3 个对象:obj1、obj2、obj3。然后我要求用户输入他们想要操作的对象。然后使用这个输入,我调用相应对象的成员函数。
string input;
cin >> input;
input.memberfunc();//where input is obj1, for example
我知道这显然不是办法,我首先必须转换字符串等,但如果能就实现我的要求的最佳方式提供任何建议,我将不胜感激。
我试图找到一种方法来调用对象的成员,但使用用户输入来确定哪个对象。所以,我有 3 个对象:obj1、obj2、obj3。然后我要求用户输入他们想要操作的对象。然后使用这个输入,我调用相应对象的成员函数。
string input;
cin >> input;
input.memberfunc();//where input is obj1, for example
我知道这显然不是办法,我首先必须转换字符串等,但如果能就实现我的要求的最佳方式提供任何建议,我将不胜感激。
你可以创建一个对象数组
Object *objects[3] = {&obj1, &obj2, &obj3};
int index;
cin >> index;
if ((index > 0) && (index < 4))
{
object[index]->memberfunc();
}
或者如果你想通过字符串选择,你可以使用地图来完成;
std::map<std::string, Object *> objectmap;
objectmap["obj1"] = &obj1;
objectmap["obj2"] = &obj2;
objectmap["obj3"] = &obj3;
std::string input;
cin >> input;
if (objectmap.find(input) != objectmap.end())
{
objectmap[input]->memberfunc();
}
您可以按照 VX 的建议进行操作。objectmap["objn"] = &objn
如果“objn”与容器中任何已存在元素的键不匹配,则调用会插入一个新元素。
你也可以使用map::insert
:
objectmap.insert( std::pair<std::string,Object*>( "objn", &objn ));
这是有关地图的更多详细信息的链接。
使用@VX answer动态添加书籍:
std::map<std::string, Book* > bookmap;
bookmap["obj1"] = &obj1;
bookmap["obj2"] = &obj2;
bookmap["obj3"] = &obj3;
//Dynamically loaded book:
Book* newBook = new Book(/* any arguments you need */);
bookmap[ newBook->getIdentifier() ] = newBook;
std::string input;
cin >> input;
if (bookmap.find(input) != bookmap.end())
{
bookmap[input]->bookmap();
} else {
cerr << "Error: book '" << input << "' not found." << endl;
}