2011-12-27 2 views
0

À droite, je suis assez nouveau pour C++ alors je continue d'apprendre ici. Si je vais à ce sujet dans le mauvais sens alors dites-moi, mais essayez de me diriger dans la bonne direction si possible (perhpaps avec un lien vers un tutoriel).C++ stocker des objets dérivés dans une carte

Je joue avec std :: map et je l'ai utilisé pour stocker un objet (item). Cela fonctionne bien. Le problème est d'essayer de stocker des éléments dérivés dans la carte. Je l'ai fait fonctionner mais il semble trancher l'objet dérivé.

Donc disons que l'item a les attributs a, b et c. et la nourriture est dérivée de l'item avec les attributs supplémentaires d et e. Je ne peux pas accéder à d et e quand il est stocké dans une carte d'éléments. Le compilateur dit:

« Erreur: « élément de classe » n'a pas nommé membre « d » »

Est-il possible d'utiliser polymorphicaly std :: carte ou dois-je utiliser une autre bibliothèque comme coup de pouce? Boost semble plutôt complexe et j'espérais qu'il y avait un moyen de le faire avec map pendant que j'apprends encore. Voici une partie du code avec lequel je joue pour clarifier ce que je veux dire.

Carte des articles est déclarée comme si:

typedef std::map <int, tItem*> itemMap; 

Les choses y sont ajoutés comme ceci:

Item * item = new Item (a, b, c); 
itemmap [vnum] = item; 
DerivedItem * deriveditem = new DerivedItem (a, b, c, d, e); 
itemmap [vnum] = deriveditem; 

Cela fonctionne, mais je ne peux pas accéder à d et e de l'élément dérivé.

Merci pour l'aide les gars

+2

Tout cela sera un terrible cauchemar de fuite de mémoire. Vous devriez utiliser des pointeurs intelligents à la place. –

+0

Je l'utilise pour apprendre, les éléments de la carte ne sont pas supprimés tant que le programme n'est pas fermé, donc il ne devrait pas y avoir de fuite de mémoire. – DizzyDuke

Répondre

3

Vous pouvez utiliser dynamic_cast jeter à la classe dérivée, si vous knwo quelle classe il est.

dynamic_cast<DerivedItem*>(itemmap[vnum])->derivedFunction(); 

http://en.wikipedia.org/wiki/Dynamic_cast

Si vous voulez que cela soit fait automatiquement, vous pouvez obtenir une nouvelle classe de modèle de std :: carte, où l'opérateur [] a un argument de modèle. Mais dans ce cas, vous devez passer le type quand vous obtenez l'article:

itemmap<DerivedItem>[vnum]->derivedFunction() 
+1

Vous devriez mentionner pour cela, les fonctions et les conteneurs doivent passer/tenir _pointers_, pas _values_. –

+0

Ce n'est pas tout à fait la réponse que je voulais, mais elle m'a indiqué dans la bonne direction. Merci! – DizzyDuke

0

Vous ne pourrez accéder à des membres spécifiques à la classe DerivedItem avec un pointeur Item. Vous pouvez le lancer:

val = static_cast<DerivedItem*>(itemmap[vnum])->d; 

.... mais cela dépend de savoir quels éléments sont de quel type dans la carte.

Pour le comportement polymorphique, vous auriez généralement une méthode dans la classe parent substituée dans les classes dérivées qui se comporte différemment.

+0

pourquoi avez-vous dupliqué Alessandro réponse? Si cela est intentionnel, SO fonctionne mal – Ulterior

+1

@Ulterior - Ce n'est pas un doublon.(a) L'explication et les conseils dans mes première et dernière phrases n'étaient pas présents dans l'autre réponse, (b) ma ligne de code est un peu différente, et (c) le malentendu dans le PO ne peut s'expliquer que de plusieurs manières . SO fonctionne bien. Je tapais ceci quand l'autre réponse a montré, et j'ai pensé que ces différences étaient une raison suffisante pour laisser ceci ici. – sje397

+0

Je recommanderais 'dynamic_cast' sur' static_cast'. –

Questions connexes