2013-04-22 60 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