2010-09-02 49 views
2

bonjour j'essaie de faire une carte contenant des objets comme suit: class Employee >> dervied from Employee: sont les classes suivantes: Worker, Manager et ViceManage. dans ma carte je veux avoir l'objet des employés triés par son ID qui est char * j'ai essayé de créer une carte comme ceci: `itérateur pour la carte

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(); 

j'ai beaucoup de problèmes dans mon code, je voudrais bien pour entendre ce que vous voulez dire à l'avance thx

+2

Quelle était la question? – jkerian

+0

comment devrais-je définir ma carte et comment puis-je utiliser un itérateur pour pouvoir utiliser des méthodes comme 'PrintEmployee()' qui existent dans l'objet ViceManager –

+0

Pourquoi 'multimap' au lieu de' map'? Pourquoi 'd' est' ViceManager * ', pas' Employé * '? Qu'est-ce que 'comp_value'? Je suggérerais d'abord de réduire la classe 'Employee' ou' ViceManager', de faire fonctionner la map, puis de la décompresser. Aussi, s'il vous plaît voir si vous pouvez poster du code C++ complet qui compile proprement. – Arun

Répondre

2

Tout d'abord, itérateur est un type qui est typedef'ed dans multimap classe de modèle dans votre cas. Vous devez donc écrire:

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

En ce qui concerne la deuxième partie de votre question, vous pouvez ajouter un nouveau champ dans la classe Employee qui identifiera le type d'employé (travailleur, directeur et ViceManage). Rabattre ensuite dépendent sur ce champ:

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

Si vos classes sont polymorphes (qui est une solution préférée), vous pouvez appeler PrintEmployee sans fonte supplémentaire:

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

Je préfère 'typedef t1 :: iterator myIterator;' de sorte que je ne répète pas les types de la carte à deux endroits. (Single-Point-of-Truth ou Dont-Repeat-Yourself) [http://en.wikipedia.org/wiki/Single_Point_of_Truth] – Arun

+0

Pourquoi proposez-vous le downcasting avant d'appeler 'PrintEmployee'? Si son comportement est différent pour différents types d'employés, il doit être virtuel. –

+0

@Mike Seymour, oui j'ai raté que 'PrintEmployee' est un membre de la classe' Employee'. –

3

Vraiment, seulement deux erreurs là, toutes deux liées aux itérateurs.

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 

Je remarque que ce code ne prend pas vraiment parti de la fonctionnalité de la carte, je suppose que ce pour d'autres sections du code.

Modification pour corriger certaines erreurs que j'ai ratées