2010-09-02 68 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 

我注意到这段代码没有真正利用地图功能,我假设这是代码的其他部分。

编辑修复一些错误我错过了