begin process at 2012 05 30 11:47:34
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

STL operateur= et constructeur par recopie


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

STL operateur= et constructeur par recopie

vendredi 18 juillet 2003 à 10:39:23 | STL operateur= et constructeur par recopie

Bebert37

Salut
c'est l'histoire d'un probleme bizarre (les voies de l'informatique sont impenetrables )
J'ai un objet RdP avec son constrcucteur par recopie et une surcharge d'operateur=
Cet objet contient 2 Listes (STL)(LTrans,LPlace). Je veux donc les recopiers dans les 2 cas. Lorsque les deux listes sont recopiees, une autre fonction se met a buguer (Descript()) qui decrit la classe RdP sous la forme d'un string !!! Pour construire ce string j'utilise des methodes Get&Set de mon objet RdP
Je pense que le probleme viens de là puisque si je n'utilise ni la surcharge = ni le constructeur par recopie dans le main() la fonction descript() ne bugue pas.
C'est bizarre non ...
si quelqu'un a une idée ???
merci .
(voici le code )
RdP::RdP(const RdP& o){
Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
strcpy(Nom,o.Nom);
/* je recopie les listes ici */
LPlace = o.LPlace;
LTrans = o.LTrans;
}

RdP RdP::operator=(const RdP& o){
Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
strcpy(Nom,o.Nom);
/* et la */
LPlace = o.LPlace;
LTrans = o.LTrans;

return *this;
}

string RdP::Descript(){

std::string Chaine;
list<Place>::iterator p;
list<TransTemp>::iterator t;
Chaine = "Reseaux de Petri : ";
Chaine = Chaine + Nom;

/* recapitulation des Places */
if(LPlace.empty() != true){
p = LPlace.begin();
/* Le Probleme arrive ici */
// lorsqu'on debug ..... BAM ça saute là
// alors que sous le debugger on a acces aux elements du RdP
// on dirait que l'affectation de la chaine bugue à cet endroit précis quoi qu'on fasse

Chaine += p->GetNom();
p++;
while(p != LPlace.end()){
Chaine = Chaine + ":";
Chaine = Chaine + p->GetNom();
p++;
}
}
.......
vendredi 18 juillet 2003 à 14:41:56 | Re : STL operateur= et constructeur par recopie

Kaid

- Dans le constructeur, tu alloues de l'espace pour une chaine de caractères mais tu oublies un caractère pour le '\0' final.

- Même erreur dans l'opérateur d'affectation. De plus, si le membre Nom de la classe pointe déjà sur quelque chose, il faudrait le libérer pour éviter les fuites mémoires.

- Quel est le type de ce que tu stockes dans les std::list ?

Kaid - kaid.fr.st

-------------------------------
Réponse au message :
-------------------------------

> Salut
> c'est l'histoire d'un probleme bizarre (les voies de l'informatique sont impenetrables )
> J'ai un objet RdP avec son constrcucteur par recopie et une surcharge d'operateur=
> Cet objet contient 2 Listes (STL)(LTrans,LPlace). Je veux donc les recopiers dans les 2 cas. Lorsque les deux listes sont recopiees, une autre fonction se met a buguer (Descript()) qui decrit la classe RdP sous la forme d'un string !!! Pour construire ce string j'utilise des methodes Get&Set de mon objet RdP
> Je pense que le probleme viens de là puisque si je n'utilise ni la surcharge = ni le constructeur par recopie dans le main() la fonction descript() ne bugue pas.
> C'est bizarre non ...
> si quelqu'un a une idée ???
> merci .
> (voici le code )
> RdP::RdP(const RdP& o){
> Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
> strcpy(Nom,o.Nom);
> /* je recopie les listes ici */
> LPlace = o.LPlace;
> LTrans = o.LTrans;
> }
>
> RdP RdP::operator=(const RdP& o){
> Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
> strcpy(Nom,o.Nom);
> /* et la */
> LPlace = o.LPlace;
> LTrans = o.LTrans;
>
> return *this;
> }
>
> string RdP::Descript(){
>
> std::string Chaine;
> list<Place>::iterator p;
> list<TransTemp>::iterator t;
> Chaine = "Reseaux de Petri : ";
> Chaine = Chaine + Nom;
>
> /* recapitulation des Places */
> if(LPlace.empty() != true){
> p = LPlace.begin();
> /* Le Probleme arrive ici */
> // lorsqu'on debug ..... BAM ça saute là
> // alors que sous le debugger on a acces aux elements du RdP
> // on dirait que l'affectation de la chaine bugue à cet endroit précis quoi qu'on fasse
>

> Chaine += p->GetNom();
> p++;
> while(p != LPlace.end()){
> Chaine = Chaine + ":";
> Chaine = Chaine + p->GetNom();
> p++;
> }
> }
> .......
>
lundi 21 juillet 2003 à 09:31:22 | Re : STL operateur= et constructeur par recopie

Bebert37


Merci bien pour ton aide precieuse.
c'est une erreur banale et je m'y suis laissé prendre.

Pour ce qui est du type des listes il s'agit d'objets Translation et Places qui sont eux même composés de listes d'objets Arcs, qui pointent sur un objet Place ou Transition suivant le cas. C'est un structure un peu bizarre mais c'est comme ça que sont fait les reseaux de Petri.

Bebert




-------------------------------
Réponse au message :
-------------------------------

> - Dans le constructeur, tu alloues de l'espace pour une chaine de caractères mais tu oublies un caractère pour le '\0' final.
>
> - Même erreur dans l'opérateur d'affectation. De plus, si le membre Nom de la classe pointe déjà sur quelque chose, il faudrait le libérer pour éviter les fuites mémoires.
>
> - Quel est le type de ce que tu stockes dans les std::list ?
>
> Kaid - kaid.fr.st
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > Salut
> > c'est l'histoire d'un probleme bizarre (les voies de l'informatique sont impenetrables )
> > J'ai un objet RdP avec son constrcucteur par recopie et une surcharge d'operateur=
> > Cet objet contient 2 Listes (STL)(LTrans,LPlace). Je veux donc les recopiers dans les 2 cas. Lorsque les deux listes sont recopiees, une autre fonction se met a buguer (Descript()) qui decrit la classe RdP sous la forme d'un string !!! Pour construire ce string j'utilise des methodes Get&Set de mon objet RdP
> > Je pense que le probleme viens de là puisque si je n'utilise ni la surcharge = ni le constructeur par recopie dans le main() la fonction descript() ne bugue pas.
> > C'est bizarre non ...
> > si quelqu'un a une idée ???
> > merci .
> > (voici le code )
> > RdP::RdP(const RdP& o){
> > Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
> > strcpy(Nom,o.Nom);
> > /* je recopie les listes ici */
> > LPlace = o.LPlace;
> > LTrans = o.LTrans;
> > }
> >
> > RdP RdP::operator=(const RdP& o){
> > Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
> > strcpy(Nom,o.Nom);
> > /* et la */
> > LPlace = o.LPlace;
> > LTrans = o.LTrans;
> >
> > return *this;
> > }
> >
> > string RdP::Descript(){
> >
> > std::string Chaine;
> > list<Place>::iterator p;
> > list<TransTemp>::iterator t;
> > Chaine = "Reseaux de Petri : ";
> > Chaine = Chaine + Nom;
> >
> > /* recapitulation des Places */
> > if(LPlace.empty() != true){
> > p = LPlace.begin();
> > /* Le Probleme arrive ici */
> > // lorsqu'on debug ..... BAM ça saute là
> > // alors que sous le debugger on a acces aux elements du RdP
> > // on dirait que l'affectation de la chaine bugue à cet endroit précis quoi qu'on fasse
> >

> > Chaine += p->GetNom();
> > p++;
> > while(p != LPlace.end()){
> > Chaine = Chaine + ":";
> > Chaine = Chaine + p->GetNom();
> > p++;
> > }
> > }
> > .......
> >
>
lundi 21 juillet 2003 à 11:47:16 | Re : STL operateur= et constructeur par recopie

Bebert37


J'ai effectué tous les changements qui s'imposaient malgres cela le probleme persiste.
J'ai remarquer que si j 'enlevai les lignes dans le constructeur par recopie et dans la surcharge d'operateur :
LTrans= o.LTrans
LPlace = o.LPlace

La recopie des liste ne se fait plus : on n'a plus d'erreur mais malheureusement nos listes ne sont alors plus recopiées.
Comment éviter ce probleme ???


-------------------------------
Réponse au message :
-------------------------------

> - Dans le constructeur, tu alloues de l'espace pour une chaine de caractères mais tu oublies un caractère pour le '\0' final.
>
> - Même erreur dans l'opérateur d'affectation. De plus, si le membre Nom de la classe pointe déjà sur quelque chose, il faudrait le libérer pour éviter les fuites mémoires.
>
> - Quel est le type de ce que tu stockes dans les std::list ?
>
> Kaid - kaid.fr.st
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > Salut
> > c'est l'histoire d'un probleme bizarre (les voies de l'informatique sont impenetrables )
> > J'ai un objet RdP avec son constrcucteur par recopie et une surcharge d'operateur=
> > Cet objet contient 2 Listes (STL)(LTrans,LPlace). Je veux donc les recopiers dans les 2 cas. Lorsque les deux listes sont recopiees, une autre fonction se met a buguer (Descript()) qui decrit la classe RdP sous la forme d'un string !!! Pour construire ce string j'utilise des methodes Get&Set de mon objet RdP
> > Je pense que le probleme viens de là puisque si je n'utilise ni la surcharge = ni le constructeur par recopie dans le main() la fonction descript() ne bugue pas.
> > C'est bizarre non ...
> > si quelqu'un a une idée ???
> > merci .
> > (voici le code )
> > RdP::RdP(const RdP& o){
> > Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
> > strcpy(Nom,o.Nom);
> > /* je recopie les listes ici */
> > LPlace = o.LPlace;
> > LTrans = o.LTrans;
> > }
> >
> > RdP RdP::operator=(const RdP& o){
> > Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
> > strcpy(Nom,o.Nom);
> > /* et la */
> > LPlace = o.LPlace;
> > LTrans = o.LTrans;
> >
> > return *this;
> > }
> >
> > string RdP::Descript(){
> >
> > std::string Chaine;
> > list<Place>::iterator p;
> > list<TransTemp>::iterator t;
> > Chaine = "Reseaux de Petri : ";
> > Chaine = Chaine + Nom;
> >
> > /* recapitulation des Places */
> > if(LPlace.empty() != true){
> > p = LPlace.begin();
> > /* Le Probleme arrive ici */
> > // lorsqu'on debug ..... BAM ça saute là
> > // alors que sous le debugger on a acces aux elements du RdP
> > // on dirait que l'affectation de la chaine bugue à cet endroit précis quoi qu'on fasse
> >

> > Chaine += p->GetNom();
> > p++;
> > while(p != LPlace.end()){
> > Chaine = Chaine + ":";
> > Chaine = Chaine + p->GetNom();
> > p++;
> > }
> > }
> > .......
> >
>
lundi 21 juillet 2003 à 14:18:44 | Re : STL operateur= et constructeur par recopie

Kaid

Dans les listes STL, le type du template est un objet ou un pointeur vers un objet ?

Kaid - kaid.fr.st

-------------------------------
Réponse au message :
-------------------------------

>
> J'ai effectué tous les changements qui s'imposaient malgres cela le probleme persiste.
> J'ai remarquer que si j 'enlevai les lignes dans le constructeur par recopie et dans la surcharge d'operateur :
> LTrans= o.LTrans
> LPlace = o.LPlace
>
> La recopie des liste ne se fait plus : on n'a plus d'erreur mais malheureusement nos listes ne sont alors plus recopiées.
> Comment éviter ce probleme ???
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > - Dans le constructeur, tu alloues de l'espace pour une chaine de caractères mais tu oublies un caractère pour le '\0' final.
> >
> > - Même erreur dans l'opérateur d'affectation. De plus, si le membre Nom de la classe pointe déjà sur quelque chose, il faudrait le libérer pour éviter les fuites mémoires.
> >
> > - Quel est le type de ce que tu stockes dans les std::list ?
> >
> > Kaid - kaid.fr.st
> >
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
> > > Salut
> > > c'est l'histoire d'un probleme bizarre (les voies de l'informatique sont impenetrables )
> > > J'ai un objet RdP avec son constrcucteur par recopie et une surcharge d'operateur=
> > > Cet objet contient 2 Listes (STL)(LTrans,LPlace). Je veux donc les recopiers dans les 2 cas. Lorsque les deux listes sont recopiees, une autre fonction se met a buguer (Descript()) qui decrit la classe RdP sous la forme d'un string !!! Pour construire ce string j'utilise des methodes Get&Set de mon objet RdP
> > > Je pense que le probleme viens de là puisque si je n'utilise ni la surcharge = ni le constructeur par recopie dans le main() la fonction descript() ne bugue pas.
> > > C'est bizarre non ...
> > > si quelqu'un a une idée ???
> > > merci .
> > > (voici le code )
> > > RdP::RdP(const RdP& o){
> > > Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
> > > strcpy(Nom,o.Nom);
> > > /* je recopie les listes ici */
> > > LPlace = o.LPlace;
> > > LTrans = o.LTrans;
> > > }
> > >
> > > RdP RdP::operator=(const RdP& o){
> > > Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
> > > strcpy(Nom,o.Nom);
> > > /* et la */
> > > LPlace = o.LPlace;
> > > LTrans = o.LTrans;
> > >
> > > return *this;
> > > }
> > >
> > > string RdP::Descript(){
> > >
> > > std::string Chaine;
> > > list<Place>::iterator p;
> > > list<TransTemp>::iterator t;
> > > Chaine = "Reseaux de Petri : ";
> > > Chaine = Chaine + Nom;
> > >
> > > /* recapitulation des Places */
> > > if(LPlace.empty() != true){
> > > p = LPlace.begin();
> > > /* Le Probleme arrive ici */
> > > // lorsqu'on debug ..... BAM ça saute là
> > > // alors que sous le debugger on a acces aux elements du RdP
> > > // on dirait que l'affectation de la chaine bugue à cet endroit précis quoi qu'on fasse
> > >

> > > Chaine += p->GetNom();
> > > p++;
> > > while(p != LPlace.end()){
> > > Chaine = Chaine + ":";
> > > Chaine = Chaine + p->GetNom();
> > > p++;
> > > }
> > > }
> > > .......
> > >
> >
lundi 21 juillet 2003 à 15:04:56 | Re : STL operateur= et constructeur par recopie

Bebert37

Ce sont des objets qui composent les listes.


-------------------------------
Réponse au message :
-------------------------------

> Dans les listes STL, le type du template est un objet ou un pointeur vers un objet ?
>
> Kaid - kaid.fr.st
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> >
> > J'ai effectué tous les changements qui s'imposaient malgres cela le probleme persiste.
> > J'ai remarquer que si j 'enlevai les lignes dans le constructeur par recopie et dans la surcharge d'operateur :
> > LTrans= o.LTrans
> > LPlace = o.LPlace
> >
> > La recopie des liste ne se fait plus : on n'a plus d'erreur mais malheureusement nos listes ne sont alors plus recopiées.
> > Comment éviter ce probleme ???
> >
> >
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
> > > - Dans le constructeur, tu alloues de l'espace pour une chaine de caractères mais tu oublies un caractère pour le '\0' final.
> > >
> > > - Même erreur dans l'opérateur d'affectation. De plus, si le membre Nom de la classe pointe déjà sur quelque chose, il faudrait le libérer pour éviter les fuites mémoires.
> > >
> > > - Quel est le type de ce que tu stockes dans les std::list ?
> > >
> > > Kaid - kaid.fr.st
> > >
> > > -------------------------------
> > > Réponse au message :
> > > -------------------------------
> > >
> > > > Salut
> > > > c'est l'histoire d'un probleme bizarre (les voies de l'informatique sont impenetrables )
> > > > J'ai un objet RdP avec son constrcucteur par recopie et une surcharge d'operateur=
> > > > Cet objet contient 2 Listes (STL)(LTrans,LPlace). Je veux donc les recopiers dans les 2 cas. Lorsque les deux listes sont recopiees, une autre fonction se met a buguer (Descript()) qui decrit la classe RdP sous la forme d'un string !!! Pour construire ce string j'utilise des methodes Get&Set de mon objet RdP
> > > > Je pense que le probleme viens de là puisque si je n'utilise ni la surcharge = ni le constructeur par recopie dans le main() la fonction descript() ne bugue pas.
> > > > C'est bizarre non ...
> > > > si quelqu'un a une idée ???
> > > > merci .
> > > > (voici le code )
> > > > RdP::RdP(const RdP& o){
> > > > Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
> > > > strcpy(Nom,o.Nom);
> > > > /* je recopie les listes ici */
> > > > LPlace = o.LPlace;
> > > > LTrans = o.LTrans;
> > > > }
> > > >
> > > > RdP RdP::operator=(const RdP& o){
> > > > Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
> > > > strcpy(Nom,o.Nom);
> > > > /* et la */
> > > > LPlace = o.LPlace;
> > > > LTrans = o.LTrans;
> > > >
> > > > return *this;
> > > > }
> > > >
> > > > string RdP::Descript(){
> > > >
> > > > std::string Chaine;
> > > > list<Place>::iterator p;
> > > > list<TransTemp>::iterator t;
> > > > Chaine = "Reseaux de Petri : ";
> > > > Chaine = Chaine + Nom;
> > > >
> > > > /* recapitulation des Places */
> > > > if(LPlace.empty() != true){
> > > > p = LPlace.begin();
> > > > /* Le Probleme arrive ici */
> > > > // lorsqu'on debug ..... BAM ça saute là
> > > > // alors que sous le debugger on a acces aux elements du RdP
> > > > // on dirait que l'affectation de la chaine bugue à cet endroit précis quoi qu'on fasse
> > > >

> > > > Chaine += p->GetNom();
> > > > p++;
> > > > while(p != LPlace.end()){
> > > > Chaine = Chaine + ":";
> > > > Chaine = Chaine + p->GetNom();
> > > > p++;
> > > > }
> > > > }
> > > > .......
> > > >
> > >
>


Cette discussion est classée dans : chaine, recopie, blue, rdp, lplace


Répondre à ce message

Sujets en rapport avec ce message

char* [ par kollibar ] je debute en C et donc je vais poser une question con...avec une chaine de caractère CHAR* comment je peut faire pour récupérer une sous chaine allant Constrcucteur par recopie et surcharge d'operateur = [ par Bebert37 ] quelqu'un pourrait-il m'exliquer comment ça se passe lors de l'utilisation du '=' en c++.Je sais que lorsqu'on surcharge le egale le constructeur par Probleme fonction System(); plz help :( [ par asurasur ] Bonjour, j'ai un soucis avec la portion de code suivante :char valeur5[1024];LireB2R(HKEY_CURRENT_USER,"software\\softphonesip","chemin",valeur5,1024) Déconcertant ! :( [ par Zeroc00l ] -={[ Zeroc00l ]}=-Bon j'ai apris recement a faire du C++cout affiche du texte une fois inclus iostream.h scanf recupere des valeur saisie a l'ecran .. demande d'aide [ par dhaw ] je demande SVP un code source en C sur la simulation d'un réseau de files d'attente, merci!! c'est très urgent!SVP aider moi !! /!\Comment envoyer par socket des donnees binaires svp [ par lolman27 ] sachant ke la fonctin send nenvoie que des characteres...si on veut envoyer une chaine comprenant un byte de valeur 0 (qui corespond a un eof en chara fonction qui retourne un char [ par glipper ] Bonjour,Voila, j'ai un probleme avec une fonction qui doit retourner une chaine de caractere ! J'ai compris qu'elle ne pouvait pas renvoyer la chaine, C++ : trop lourd ? [ par guiguikun ] Cela fait quelques mois que je suis passé du C pur et dur au C++.Plus je programme objet et plus je me pose les mêmes questions...Ok c'est bien pratiq Quelles sont les bases... [ par Zeil ] Bon, attention, le pavé est en cours de rédaction.Commençons par ma présentation:Je suis étudiant en 2eme candidature informatique (Belgique) et je co pbme avec chaine de caractère et sscanf (débutant :( ) [ par peyou ] sur une chaine de caractère de la forme "bidule = machin", je voudrais extraire les deux chaines "bidules" et " machin"1/ le nombre d'espace autour du


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 0,842 sec (3)

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