begin process at 2010 02 09 19:33:15
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

STL: Problème stockage dans un container multimap


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

STL: Problème stockage dans un container multimap

jeudi 22 mai 2008 à 21:24:29 | STL: Problème stockage dans un container multimap

elnino67

Bonsoir,

Nous utilisons un programme ayant recours à une multimap utilisant:

[code] multimap<string, class Client> m;[\CODE]

en clé: le champ nom d'une classe Client, et en objet: Client.

Code :
  class Client {private:          int m_id;          string m_nom;          string m_prenom;          Adresse *m_adress;            public:          void afficher(std::ostream &out);                Client();          ~Client();          string getnom();          string getprenom();          Adresse* getadress();          void setnom(string);          void setprenom(string);          void setadress(Adresse*);          Client nouveauclient();          Client &operator=(const Client &);          //acheter();//avis();       };
Nous avons crée une fonction devant permettre la création d'un nouveau client via la saisie de l'utilisateur.

Code :
 Client Client :: nouveauclient(){                      Client nouveau;       int num,cp;       char nom2[200],prenom2[200],rue2[400],ville2[200];                 string rue,ville;                                                                                    cout << "veuillez saisir votre nom : " <<endl;                 fflush(stdin);                 gets(nom2);                     cout << "veuillez saisir votre prenom : " <<endl;                 fflush(stdin);                 gets(prenom2);                       cout << "veuillez saisir votre numero d'adresse : " <<endl;                 cin>>num;                       cout<< "Veuillez saisir votre rue : "<<endl;                 fflush(stdin);                 gets(rue2);                       cout << "Veuillez saisir votre ville : "<<endl;                 fflush(stdin);                 gets(ville2);                       cout << "veuillez saisir votre code postal : " <<endl;                 cin>>cp;                     nouveau.setnom(nom2);                 nouveau.setprenom(prenom2);                 rue=rue2;                 ville=ville2;                         nouveau.getadress()->setnum(num);                 nouveau.getadress()->setville(ville);                 nouveau.getadress()->setrue(rue);                 nouveau.getadress()->setcp(cp);                         return nouveau; }  
Le retour de cette fonction est affecté dans le main à une variable de type Client:

Code :
 clien=clien.nouveauclient();
Ce nouveau client nous essayons de l'insérer dans la multimap de la manière suivante :

Code :
  m.insert(make_pair(clien.getnom(),clien));  
Mais une fois cette insertion effectué, l'affichage du contenu de la multimap fais planter le programme.

Le seul moyen de réussir à afficher le contenu de la multimap est de changer l'objet en l'établissant comme pointeur :

Code :
multimap<string, class Client*> m;
Ainsi que l'insertion :

Code :
m.insert(make_pair(clien.getnom(),&clien));
Et l'affichage :

Code :
for( it=m.begin() ; it != m.end(); it++ ) cout << "Clef : " << (*it).first << endl << "Client :" << *(*it).second << endl;
Mais le problème devient que le contenu de la multimap ne change pas pour ce qui est de la donnée, la clé change mais l'objet affiché correspond au dernier client saisi.

Merci d'avance pour votre aide, qui nous serait très précieuse!!
vendredi 23 mai 2008 à 17:03:32 | Re : STL: Problème stockage dans un container multimap

buno

Réponse acceptée !
Salut,
Y'a un truc qui me chiffonne: dans la fonction "nouveauClient", tu crée une variable locale, tu joue avec...et tu la retournes!! Pas bien... En effet, toute variable locale est détruite en sortie de fonction: il faut, soit passer un objet en paramètre de ta fonction, soit allouer un pointeur et retourner ce pointeur.

Mais bon, si ta map doit contenir beaucoup d'objet, c'est mieux d'y stocker des pointeurs...

En espérant avoir répondu à la question.

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
vendredi 23 mai 2008 à 17:21:35 | Re : STL: Problème stockage dans un container multimap

luhtor

"En effet, toute variable locale est détruite en sortie de fonction: il faut, soit passer un objet en paramètre de ta fonction, soit allouer un pointeur et retourner ce pointeur."
=> Mais non, je sais pas d'ou ca sort ca. On a vu plusieurs fois cette remarque et c'est faux. Aucun pb à retourner un objet local tant qu'on en stocke pas le pointeur.

Pour ton pb, soit ta classe est incorrecte. Soit le pb est ailleurs, mais tu postes trop peu de code pour qu'on puisse analyser quoi que ce soit.
vendredi 23 mai 2008 à 17:32:17 | Re : STL: Problème stockage dans un container multimap

elnino67

J'ai manipulé un petit peu ma fonction en renvoyant un pointeur, et effectivement cela a résolu tous mes problèmes..
Pour autant luthor ton avis m'intéresse!On m'a moi aussi appris qu'une variable définie localement n'a une durée de vie équivalente uniquement à la fonction où elle est définie..Pourrais-tu m'en dire plus sur ce en quoi tu crois toi?


PS: Merci beaucoup Buno!!
vendredi 23 mai 2008 à 18:24:06 | Re : STL: Problème stockage dans un container multimap

luhtor

int main()
{
    float value = sqrtf(10.0f);
    return 0;
}

Si l'objet retourné était invalide, on ne pourrait pas écrire ces quelques lignes puisque la valeur retourner par sqrtf est bien locale à la fonction... Or ce qui est vrai ici l'est aussi pour n'importe quel objet. Un objet alloué localement et retourné par la fonction reste  valide jusqu'à sa destruction, c'est à dire après que l'on ait pu en récupérer la valeur.

Pour clarifier, voici un exemple clair. Tu peux éxécuter ce code, le résultat est à la fin du post.

#include <iostream>

class Test
{
    public:
       
        Test() { std::cout << "constructeur" << std::endl; }
        Test(const Test &) { std::cout << "copie" << std::endl; }
        ~Test() { std::cout << "destructeur" << std::endl; }
       
        Test & operator = (const Test &)
        {
            std::cout << "affectation" << std::endl;
           
            return *this;
        }
};

Test BuildObject()
{
    std::cout << "fonction" << std::endl;
   
    Test ret;
   
    return ret;
}

int main(int argc, char *argv[])
{
    {
        Test obj1;
       
        obj1 = BuildObject();
    }
   
    system("PAUSE");
   
    return 0;
}

Et voici un résultat de run:

constructeur            => Constructeur de "Test obj1:"
fonction                  => Dans la fonction BuildObject
constructeur           => Constructeur de l'objet local a la fonction "Test ret;"
affectation            => Objet local renvoyé par la fonction, envoyé en argument à l'affectation (opérateur =)
destructeur          =>Destructeur de l'objet retourné par la fonction
destructeur             => Destructeur de "Test obj1;"
Appuyez sur une touche pour continuer...

Comme on le voit et heureusement, le destructeur de l'objet qui est retourné par la fonction est appelé après l'affectation !
Ce qui n'est pas possible c'est de décupérer l'adresse de cet objet, puisqu'il va etre détruit après etre passé dans l'opérateur d'affectation (=).

Donc oui tes lignes étaient correctes, le pb est ailleurs. C'est le débuggeur qui aurait pu te donner les pistes pour comprendre le vrai problème.


Cette discussion est classée dans : code, string, client, cout, multimap


Répondre à ce message

Sujets en rapport avec ce message

Premier Poste, premier code :p [ par Locarre ] Bonsoir à tous, je me suis au C++ depuis très peu de temps, voila un petit code source, et j'aimerais bien que vous me disiez si celui ci par sur de b Destructeur intempestif [ par mliuej ] Bonsoir, J'ai un nouveau problème dans mon application : lorsque je crée un objet, plusieurs destructeurs s'enclenchent sans que j'en aie donné l'ins Client - Serveur . TCP [ par sebounty ] Bonjour,Je suis, comme qui dirais debutant en Programmation C, C++.Aujourd'hui j'aimerais réaliser un Client Serveur TCP, Cependant, tous les codes qu Plantage lors de l'exécution ! [ par mliuej ] Bonjour à tous, Voici une fonction simple qui est sensée enregistrer un objet "Visiteur" ainsi qu'un objet "BilletEntree", et les afficher tous les d gestion d'un cinéma [ par rouday55 ] Bonsoir bonsoir ! Je suis novice en langage c, je m'y suis mis depuis début novembre et j'ai quelques lacunes dans la résolution de mon problème. En f Recevoir message avec mon serveur [ par Nixeus ] Bonjour amis codeur !Je code actuellement un serveur en MFC avec Visual Studio 6.Il fonctionne très bien, le serveur démarrer, il est en écoute, et un Grave problème de lecture d'un tableau string [ par alincoln54 ] Bonjour à tous,Le code suivant ne fonctionne pas (BCB C++) :#include #include #include #include #include < Palindrome c++ [ par bretdu55 ] Bonjour, voila je doit faire un programme qui vérifie si le mot est un palindrome ou non, et qui retourne un booléen. Voila mon prog, si quelqu'un peu String to Char puis Char to Int puis Int to Char puis Char to Int [ par gooooo ] Bonjour, Je débute avec Visual C++ et j'avoue que j'ai un peu de mal. Habituellement j'utilise Qt et la il y a du changement. Voici le problème : J Operateur + (string) [ par victorcoasne ] Bonjour, Je voulais faire un code du genre : [code=cpp]#include #include using namespace std; int main() { string test = "a" + "b"; cout


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,198 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales