итератор для карты - PullRequest
       23

итератор для карты

2 голосов
/ 02 сентября 2010

Здравствуйте, я пытаюсь создать карту, содержащую объекты в следующем виде: класс Employee >>, полученный из Employee: это следующие классы: Worker, Manager и ViceManage. на моей карте я хочу, чтобы объект Employee сортировался по его идентификатору, который является 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();

У меня много проблем в коде, я очень хотел бы услышать, что вы, ребята, хотите сказать заранее, спасибо

Ответы [ 2 ]

3 голосов
/ 02 сентября 2010

Действительно, там только две ошибки, обе связаны с итераторами.

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

Я заметил, что этот код на самом деле не использует преимущества карты, я полагаю, что это для других разделов кода.

Редактирование, чтобы исправить некоторые ошибки, которые я пропустил

2 голосов
/ 02 сентября 2010

Прежде всего, итератор - это тип, который определен типом в multimap шаблонном классе в вашем случае.Поэтому вам нужно написать следующее:

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

Что касается второй части вашего вопроса, вы можете добавить новое поле в классе Employee, которое будет идентифицировать тип сотрудника (Worker, Manager и ViceManage).Затем приведите в зависимости от этого поля:

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

Если ваши классы полиморфны (что является предпочтительным решением), вы можете вызвать PrintEmployee без дополнительного приведения:

myIterator->second->PrintEmployee();
...