2012-04-26 4 views
5

Considérons que j'ai un nom de classe People. Je stocke des pointeurs vers ces personnes dans une carteComment gérer une carte avec des pointeurs?

map<string, People*> myMap; 

Pour créer de nouvelles personnes, j'utilise l'opérateur maps []. Mais cela me donne une erreur de segmentation et n'appelle même pas le constructeur de la classe People.

J'ai aussi essayé

myMap.insert(std::make_pair("dave", new People())); 

Mais cela ne change rien, le constructeur est toujours pas appelé et le programme se tait traitement vers le bas ce code avec une erreur de segmentation.

Comment accéder et manipuler une carte avec des pointeurs? Pourquoi ce qui précède ne fonctionne pas, je ne reçois pas d'erreurs de temps de compilation ou d'avertissements.

Toute idée très apprécié, merci

Répondre

9

Compte tenu de la carte:

map<string, People*> myMap; 

operator[] ne sera pas créer de nouveaux People, il va créer People*, à savoir des pointeurs qui ne pointent pas à quoi que ce soit.

La solution la plus simple est de rendre votre carte contient vraiment les gens, pas des pointeurs, .: par exemple

map<string, People> myMap; 

alors la gestion de la mémoire est tout MANIPULÉE vous, en utilisant operator[] construira de nouvelles personnes au besoin.

+1

ou des pointeurs intelligents, si la construction de 'People' est cher –

+0

Merci pour les explications claires! – user1356190

2

Essayez

myMap["dave"] = new People(....); 

Le new appellera le constructeur, retourner un pointeur et l'insérer dans la carte.

Cependant, vous devez faire attention aux fuites de mémoire. Utilisez des pointeurs intelligents pour surmonter ce problème.

+0

Merci cela a parfaitement fonctionné dans ma mise en œuvre actuelle. – user1356190

0

Si vous souhaitez mettre en tas votre People en utilisant une carte, regardez un Boost Pointer Containers, plus précisément le boost::ptr_map. C'est uniquement l'en-tête, vous n'avez donc pas besoin de compiler des bibliothèques supplémentaires.

#include <iostream> 
#include <string> 
#include <boost/ptr_container/ptr_map.hpp> 

struct People 
{ 
    int age; 
}; 

typedef boost::ptr_map<std::string,People> PeopleMap; 

int main(int,char**) 
{ 
    PeopleMap data; 

    data["Alice"].age = 20; 
    data["Bob"].age = 30; 

    for (PeopleMap::const_iterator it = data.begin(); it != data.end(); ++it) 
     std::cout << "Name: " << it->first << " Age: " << it->second->age << std::endl; 

    return 0; 
} 
0

Essayez d'utiliser:

People* new_people = new People (member_variable1,member_variable2); 

myMap.insert(std::pair<std::string, People*>("key for string",new_people)); 

ou autrement:

People new_people(member_variable1,member_variable2); 
myMap.insert(std::pair<std::string, People*>("key for string",&new_people)); 

deux fonctionneront !!!

Questions connexes