begin process at 2012 02 11 10:47:34
  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

Administrateur CodeS-SourceS
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 Problème pour stoker une string dans un char* [ par Faroww ] Salut, Alors voici mon problème j'utilise une OpenFileDialog (Parcourir)pour permette a l'utilisateur de choisir un fichier. Je récupéré le patch du Comment parcourir la pile de réception [ par riked ] Bonjour, Je programme actuellement une bibliothèque permettant l'utilisation des protocoles TCP et UDP à l'aide de Winsock. Cette bibliothèque permet conversion de flottant en string [ par biduletrucmachin ] Bonjour j'essaie en vain d'utiliser la fonction sscanf pour convertir une des données flottantes en string. Est ce que quelqu'un connait la syntaxe ex Ajouter, Modifier ou Supprimer(lire et écrire) dans un fichier texte [ par cathy9999 ] Bonjour, je souhaite réaliser une gestion de clients en c++, c'est à dire me permettre d'afficher, ajouter, modifier ou supprimer un client qui serait Client -> Serveur [ par norton ] Bonjour à tous. N'étant pas encore assez expérimenté dans le domaine des sockets je vous demande conseil.Je code sous Borland Builder C++ 6 avec les S


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 1,295 sec (4)

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