2010-09-02 110 views
2

你好我正在試圖做一個包含如下對象的地圖:類員工>>從僱員dervied:是以下類:工人,經理和ViceManage。 在我的地圖我想有他的ID排序的對象員工這是char * 我試圖創建一個地圖就像這樣:'迭代器的地圖

multimap<const string,Employee*> t1 
t1<string,Employee>::iterator myIterator; 
Date e(17,6,1985); 
Address a("somecity","somestreet",15,12); 
ViceManager* d = new ViceManager("John","Doh","035845778", e,a,"03-9458353",10000,85,"gsdasda"); 
t1.insert(make_pair(d->GetId(),d)); 
myIterator=t1.begin(); 
myIterator->comp_value->PrintEmployee(); 

我得到了很多的問題,在我的代碼我非常喜歡聽取你們想提前thx的意見

+2

問題是什麼? – jkerian 2010-09-02 16:23:33

+0

我應該如何定義我的地圖,以及如何使用迭代器來使用像對象副本中存在的'PrintEmployee()'方法副本 – 2010-09-02 16:25:23

+0

爲什麼'multimap'而不是'map'?爲什麼'd'是'ViceManager *',而不是'Employee *'?什麼是「comp_value」?我建議先修剪'Employee'或'ViceManager'類,使地圖工作,然後展開。另外,請看看您是否可以發佈完整編譯的完整C++代碼。 – Arun 2010-09-02 16:40:30

回答

2

首先,迭代器是在你的案例中的multimap模板類中的typedef。所以,你需要寫:

multimap<const string,Employee*>::iterator myIterator; 

至於你的問題的第二部分,你可以在Employee類,將確定員工類型(工人,經理和ViceManage)添加一個新的領域。

if (myIterator->type == VICE_MANAGER) 
    static_cast<ViceManager*>(*myIterator->second)->PrintEmployee(); 

如果你的類是多態的(這是首選的解決方案),你可以調用PrintEmployee無需額外投:

myIterator->second->PrintEmployee(); 
+0

我更喜歡 'typedef t1 :: iterator myIterator;' 這樣我就不會在兩個地方重複地圖的類型。 (單點真理或不重複自己)[http://en.wikipedia.org/wiki/Single_Point_of_Truth] – Arun 2010-09-02 16:32:05

+0

爲什麼在調用'PrintEmployee'之前建議向下轉換?如果不同員工類型的行爲不同,那麼它應該是虛擬的。 – 2010-09-02 17:11:26

+0

@Mike Seymour,是的,我錯過了'PrintEmployee'是'Employee'類的成員。 – 2010-09-02 17:24:45

3

真的,有隻有2次失誤,這兩個相關的則取決於現場投到迭代器。

multimap<const string,Employee*> t1; 
multimap<string,Employee*>::iterator myIterator; //Note the corrected iterator type 
Date e(17,6,1985); 
Address a("somecity","somestreet",15,12); 
Employee* d = new ViceManager("John","Doh","035845778", e,a,"03-9458353",10000,85,"gsdasda"); 
t1.insert(make_pair(d->GetId(),d)); 
myIterator=t1.begin(); 
myIterator->second->PrintEmployee(); //Note the way of accessing the value 

我注意到這段代碼沒有真正利用地圖功能,我假設這是代碼的其他部分。

編輯修復一些錯誤我錯過了