begin process at 2012 05 28 22:40:13
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

constructeur de recopie et pointeur sur pointeur


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

constructeur de recopie et pointeur sur pointeur

jeudi 12 août 2004 à 22:16:00 | constructeur de recopie et pointeur sur pointeur

popi0016

Bonjour je bloque sur la définition d'un constructeur de recopie d'une classe "liste" afin de sortir du programme principale sans provoque une exeption ou erreur... :)
Je me doute que cela tourne autour des "news" et "delete" mais je dois mal les utiliser... merci pour une solution et voici le code :

****************************************************

l'entete

//---------------------------------------------------------------------------
#ifndef MULTIPLE
#define MULTIPLE
//---------------------------------------------------------------------------
#include <iostream>
#include <cstddef>
using namespace std;
//---------------------------------------------------------------------------
/* Définition de la structure element
*/
struct element
{
element *suivant; // un pointeur sur l'élément suivant
void *contenu; // un pointeur de type indéfini sur le contenu
};
/* Définition de la classe liste
*/
class liste
{
element *debut; // le premier élément
element *courant; // l'élément courant (en traitement)
public :
inline liste(); // constructeur
inline ~liste(); // destructeur
//inline liste(const liste &);
void ajoute(void *);
void premier();
void * prochain();
int fini();
};
//---------------------------------------------------------------------------
inline liste :: liste()
{
debut = NULL;
courant = NULL;
}
//---------------------------------------------------------------------------
inline liste :: ~liste()
{
element *suiv;
courant = debut;
while(courant != NULL)
{
suiv = courant->suivant;
delete courant;
courant = suiv;
}
}
//---------------------------------------------------------------------------
/*inline liste :: liste(const liste &l)
{
a définir
}*/
//---------------------------------------------------------------------------
void liste :: ajoute(void *chose)
{
element *adel = new element;
adel->suivant = debut;
adel->contenu = chose;
debut = adel;
}
//---------------------------------------------------------------------------
void liste :: premier()
{
courant = debut;
}
//---------------------------------------------------------------------------
void * liste :: prochain()
{
void * adel = NULL;
if(courant != NULL)
{
adel = courant->contenu;
courant = courant->suivant;
}
return adel;
}
//---------------------------------------------------------------------------
int liste :: fini()
{
return (courant == NULL);
}
//---------------------------------------------------------------------------
/*
*/
class point
{
int x;
int y;
public :
inline point(int abs, int ord);
inline point(const point &);
inline point & operator =(const point &);
inline ~point();
inline void affiche();
};
//---------------------------------------------------------------------------
inline point :: point(int abs=0, int ord=0)
{
x = abs;
y = ord;
}
//---------------------------------------------------------------------------
inline point :: point(const point &pt)
{
x = pt.x;
y = pt.y;
}
//---------------------------------------------------------------------------
inline point & point :: operator =(const point &pt)
{
if(&pt != this)
{
x = pt.x;
y = pt.y;
}
return *this;
}
//---------------------------------------------------------------------------
inline point :: ~point()
{
}
//---------------------------------------------------------------------------
void point :: affiche()
{
cout << "Coordonnees : " << x << " " << y << "\n";
}
//---------------------------------------------------------------------------
/*
*/
class liste_points : public liste, public point
{
public :
liste_points() {}
void affiche();
};
//---------------------------------------------------------------------------
void liste_points :: affiche()
{
premier();
while( ! fini() )
{
point *ptr = (point*) prochain();
ptr->affiche();
}
}
//---------------------------------------------------------------------------
#endif

**********************************************************

le main

//---------------------------------------------------------------------------
#include "multiple.h"
void f(liste);
//---------------------------------------------------------------------------
int main()
{
liste_points l, l_temp;
point a(2,3);
point b(5,9);
point c(0,8);
l.ajoute(&a);
l.affiche();
cout << "---------------------\n";
l.ajoute(&b);
l.affiche();
cout << "---------------------\n";
l.ajoute(&c);
l.affiche();
cout << "---------------------\n";
f(l);
return 0;
}
//---------------------------------------------------------------------------
void f(liste l)
{
}

vendredi 13 août 2004 à 00:13:13 | Re : constructeur de recopie et pointeur sur pointeur

thierry la fronde

Membre Club
Tout d'abord, une chose me frappe :
void * liste :: prochain()
{
void * adel = NULL;
if(courant != NULL)
{
adel = courant->contenu;
courant = courant->suivant;
}
return adel;
}

Cette fonction n'est-elle pas censée renvoyer un pointeur sur un suivant ? Ou alors le nom est mal choisi ?!

Ensuite, si je comprend bien tu veux créé une liste composée d'éléments ou reprendre une liste déjà créée et sauvegardée. Me trompai-je ?

Dans ce cas tu dois recupérer un a un les éléments de ta liste sauvegardée et les affecter à ta nouvelle liste courante.

Je te conseille aussi d'ajouter un compteur d'élément dans ta liste
class MaListe
{


....


int NbreDelements;
int LeNbreDelementDeLaListe();

}//bien pratique pour les boucles;

Autre conseil dans ta notation : Utilise des Majuscules pour les noms de fonctions et variables et un 'p' devant pour les pointeurs:

struct Element
{
Element *pSuivant; // un pointeur sur l'élément suivant
void *pContenu; // un pointeur de type indéfini sur le contenu
};
vendredi 13 août 2004 à 07:06:31 | Re : constructeur de recopie et pointeur sur pointeur

djl

il te faut egalement l'operateur =

a par ca c'est du c, le void * sert de pointeur generique uniquement en c, en c++ seul la conversion int* -> void* est implicite

oublie tout ce que tu a vue, lis un cours sur les template et utilise std::list
vendredi 13 août 2004 à 10:57:26 | Re : constructeur de recopie et pointeur sur pointeur

magic_Nono

Membre Club
si ça peut-t'aider lit mon source : BListeIndir...

Magic Nono: l'informagicien!
vendredi 13 août 2004 à 17:57:52 | Re : constructeur de recopie et pointeur sur pointeur

popi0016

bein lorsque je déclare mon constructeur de telle sorte :

liste :: liste(const &l)

j'aimerai recopie l'objet référencé "l" dans la nouvelle liste qui est appele avec le constructeur de recopie...

je veux juste définir moi meme ce constructeur de rocopie pour pouvoir passer l'objet liste en parametre sans le referencer ou utiliser son adresse via un pointeur...

sinon je sais et connais l'utilisation des templates, conteneur et autres standards de la STL mais je voudrai tout faire comme un grand tout seul et réussir a, via le destructeur, enlever mes objets de la memoire dynamique sans provoquer d'erreur lorsque le destructeur est appele car avec mes essais il doit supprimer deux ou plusieurs fois le meme objet et donc creer une ambiguite



vendredi 13 août 2004 à 18:03:49 | Re : constructeur de recopie et pointeur sur pointeur

popi0016

"Cette fonction n'est-elle pas censée renvoyer un pointeur sur un suivant ? Ou alors le nom est mal choisi ?!

Ensuite, si je comprend bien tu veux créé une liste composée d'éléments ou reprendre une liste déjà créée et sauvegardée. Me trompai-je ?"

je veux juste effectuer une recopie de ma liste lorsqu'elle est passee en parametre dans une fonction quelconque pour ne pas la passer en reference ou via son pointeur, c'est tout comme je l'ai fait pour l'objet point :

point :: point(const point &P)
{
x = P.x ;
y = P.y ;
}

voila... mais en faisant mes essai je la recopie tres mal et surtout je detruit le meme objet plusieurs fois en sortie de fonction ou du main via le destructeur qui ne peut "delete" un pointeur sur NULL

: ) : ) :)

vendredi 13 août 2004 à 19:31:01 | Re : constructeur de recopie et pointeur sur pointeur

djl

pour ton constructeur par copie, tu parcour la liste en parametre et tu insert les elements parcourues
il faut aussi que tu rajoute l'operateur = si tu veux que ta classe soit proteger contre les fuites


ne fais jamais ca

point :: point(const point &P)
{
x = P.x ;
y = P.y ;
}

c'est de la desoptimisation, le compilo le fait tres bien, et meme mieux tout seul
vendredi 13 août 2004 à 22:25:08 | Re : constructeur de recopie et pointeur sur pointeur

thierry la fronde

Membre Club
" je detruit le meme objet plusieurs fois en sortie de fonction ou du main via le destructeur qui ne peut "delete" un pointeur sur NULL"

if(MonPointeur !=NULL)
delete MonPointeur;
vendredi 13 août 2004 à 22:28:39 | Re : constructeur de recopie et pointeur sur pointeur

popi0016

"ne fais jamais ca

point :: point(const point &P)
{
x = P.x ;
y = P.y ;
}

c'est de la desoptimisation, le compilo le fait tres bien, et meme mieux tout seul"

a bon ce n'est pas bon de definir le const. de recopie comme je l'ai fait... ?

en gros le compilo le fait mieux que ça :

[inline point :: point(const point &pt)
{
x = pt.x;
y = pt.y;
}
//---------------------------------------------------------------------------
inline point & point :: operator =(const point &pt)
{
if(&pt != this)
{
x = pt.x;
y = pt.y;
}
return *this;
}
]

pour la recopie et l'affectation ?

sinon comment parcourir ma liste en parametre puisqu'elle est constante ?

merci de ton suivi : ) : ) :)
vendredi 13 août 2004 à 22:31:51 | Re : constructeur de recopie et pointeur sur pointeur

thierry la fronde

Membre Club
liste :: liste(const &l)
{

liste *pNouvelleListe = new liste;

pNouvelleListe->Ajouter(l->Premier());
while(/*condition qui va bien*/)
pNouvelleListe->Ajouter(l->Prochain());


}

?? peut-être

1 2

Cette discussion est classée dans : int, liste, void, courant, inline


Répondre à ce message

Sujets en rapport avec ce message

Problème avec liste chainée [ par MasterShadows ] Bonjour à tous ,alors voilà dans le cadre de mon tp de C je dois créer une liste simplement chainée tout ce qu'il y'a de plus générique.donc on nous d Problème avec les polygones [ par nisaloncaje ] Bonjour, j'ai le code source suivant : #include #include double a=0,inca=0.1; /* Prototype des fonctions */void affichage();void clavier(unsigned Variables globales [ par nisaloncaje ] Bonjour, je suis en train de créer un petit programme en c (j'utilise devc++) et j'ai un problème : je n'y comprends rien au variables globales !En ef parcours en profondeur dans un graphe [ par Tavarez59282 ] Bonjour j'ai un sujet de tp à realiser sur les graphes à l'aide de listes d'adjacence et j'ai un incident de segmentation dans mon code lorsque j'exec jeux d'échec qui nous met en échec!! [ par shinohinata01 ] Bonjour,nous rencontrons actuellement un problème sur un de nos programmes qui traite d'un jeux d'échec.en gros nous avons une fonction dans une class !!! Position du curseur !!! [ par yoyo269 ] Bonjour à toutes et à tous !Je cherche un moyen (en mode console sous Linux) de pouvoir placer le curseur là où je le voudrais.J'ai essayé avec ce cod recherche aide SVP [ par gelloula ] J 'ai un projet à faire en borlandc en mode BGI, Je suis encore une debutante et je bloque là dessus depuis une semaine. erreur de mémoire mais je trouve pas le bug [ par dybman ] Voici le code qui pose problème:Je pense que la valeur Key prend de trop grande valeur et fais un dépassement de mémoire tampon mais je trouve pas le Une méthode virtuelle appelée depuis un destructeur n'est pas héritée!? [ par Forman ] Bonjour(soir) à tous,je viens de me mettre au C++ et à GLUT et je bute sur un problème que je n'arrive pas à m'expliquer. D'abord, voilà le code en qu multi heritage [ par foxz ] Bonjour,d'une maniere general.class strm{ // base stream virtual int w(void*,int)=0; // write virtual int r(void*,int)=0; //read};class fil:virtual pu


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,593 sec (3)

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