2013-04-22 79 views
0

我想找到一种方法来调用对象的成员,但使用用户输入来确定哪个对象。所以,我有3个对象:obj1,obj2,obj3。然后我要求用户输入他们想操作的对象。然后使用这个输入,我调用相应对象的成员函数。使用cin调用对象的成员来获取对象名称

string input; 
cin >> input; 
input.memberfunc();//where input is obj1, for example 

我明白,这显然不是办法,那我就先必须将字符串转换等,但希望在实现我的需求的最佳途径的任何建议。

+0

没有什么建于这一点。你必须自己编写代码,比如'if(input ==“obj1”)obj1.memberfunc();'等。 – 2013-04-22 21:33:33

+0

你可以使用std :: map。 – 2013-04-23 02:09:23

回答

0

您可以创建对象

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(); 
} 
+0

非常感谢,这有所帮助。虽然,如果我希望在需要时添加更多对象,我仍然可以使用此方法。这个问题的目的是能够创建一个图书馆目录系统,从而使对象成为书籍。然后要求用户输入要借用的书的名称,然后调用book1.borrowed();功能。但是,也必须有可能在目录中添加更多书籍。使用您提供的方法,每次扩展目录时是否必须重新定义数组? – user2308968 2013-04-22 22:37:35

+0

@ V-X显示的第二种方式(使用地图)允许您动态添加任何对象(我将发布代码作为答案)。 – fstamour 2013-04-23 01:54:46

0

你可以像V-X建议的那样做。如果“objn”与容器中任何已存在的元素的键不匹配,调用objectmap["objn"] = &objn将插入一个新元素。

您还可以使用map::insert

objectmap.insert(std::pair<std::string,Object*>("objn", &objn));

下面是对map更多详细信息的链接。

0

使用@ V-X的答案动态添加图书:

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; 
} 
+0

太好了,那正是我需要的。谢谢 – user2308968 2013-04-23 10:23:57