C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

[noob] Constructeur par recopie

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
TSalm
Guest





PostPosted: Tue Apr 10, 2007 2:03 am    Post subject: [noob] Constructeur par recopie Reply with quote



Bonjour,

j'ai défini une classe où j'y ai défini un constructeur
par recopie :
// constructeur par recopie
pile_entier(pile_entier & p) {
cout << "Constructeur par recopie de taille " << *p.ent << endl;
ent = new int[p.taille];
taille = p.taille;
position = p.position;

for (int i=0;i<=position;++i) {
ent[i] = p.ent[i];
}
}

Voici deux cas, le premier fonctionne, l'autre non :

// Celui-ci fonctionne parfaitement :
pile_entier p;
/* traitements sur p */
pile_entier r = p;

// Mais celui là ne fonctionne pas :
pile_entier p;
pile_entier r;
/* traitements sur p */
r = p; // Me retournera une erreur : *** glibc detected *** double free or
corruption (!prev): 0x0804a008 ***

Je ne comprends pas très bien pourquoi, dans le deuxiéme cas, il ne
passe pas par mon constructeur par recopie !?

D'avance merci,
TSalm
Back to top
Michel Decima
Guest





PostPosted: Tue Apr 10, 2007 2:26 am    Post subject: Re: [noob] Constructeur par recopie Reply with quote



TSalm wrote:
Quote:
Bonjour,

j'ai défini une classe où j'y ai défini un constructeur
par recopie :
// constructeur par recopie
pile_entier(pile_entier & p) {
cout << "Constructeur par recopie de taille " << *p.ent << endl;
ent = new int[p.taille];
taille = p.taille;
position = p.position;

for (int i=0;i<=position;++i) {
ent[i] = p.ent[i];
}
}

tu pourrais passer le parametre par reference constante (mais ca n'a
rien a voir avec le probleme).
Quote:

Voici deux cas, le premier fonctionne, l'autre non :

// Celui-ci fonctionne parfaitement :
pile_entier p;
/* traitements sur p */
pile_entier r = p;

// Mais celui là ne fonctionne pas :
pile_entier p;
pile_entier r;
/* traitements sur p */
r = p; // Me retournera une erreur : *** glibc detected *** double free or
corruption (!prev): 0x0804a008 ***

Je ne comprends pas très bien pourquoi, dans le deuxiéme cas, il ne
passe pas par mon constructeur par recopie !?

Parce que, dans le deuxieme cas, il ne s'agit pas de construction par
copie mais d'affectation. Et si tu ne fais rien, le compilateur te
donnes une version par defaut qui ne conviendra pas dans le cas present.

Donc, il te faudrait dans ta classe pile_entier une fonction avec le
prototype suivant:

void pile_entier::operator=( pile_entier const& p );

Mais bon... pourquoi ne pas encapsuler un std::vector<int> dans la
classe pile_entier ? Ca aurait l'avantage de laisser de coté ce genre de
problemes. Et tant qu'a faire, vu le nom de la classe, il y a aussi
std::stack<int> qui doit convenir.
Back to top
TSalm
Guest





PostPosted: Wed Apr 11, 2007 12:57 am    Post subject: Re: [noob] Constructeur par recopie Reply with quote



On Mon, 09 Apr 2007 23:26:05 +0200, Michel Decima wrote:

Quote:
TSalm wrote:
j'ai défini une classe où j'y ai défini un constructeur
par recopie :
// constructeur par recopie
pile_entier(pile_entier & p) {
cout << "Constructeur par recopie de taille " << *p.ent << endl;
ent = new int[p.taille];
taille = p.taille;
position = p.position;

for (int i=0;i<=position;++i) {
ent[i] = p.ent[i];
}
}

tu pourrais passer le parametre par reference constante (mais ca n'a
rien a voir avec le probleme).

Voici deux cas, le premier fonctionne, l'autre non :

// Celui-ci fonctionne parfaitement :
pile_entier p;
/* traitements sur p */
pile_entier r = p;

// Mais celui là ne fonctionne pas :
pile_entier p;
pile_entier r;
/* traitements sur p */
r = p; // Me retournera une erreur : *** glibc detected *** double free or
corruption (!prev): 0x0804a008 ***

Je ne comprends pas très bien pourquoi, dans le deuxiéme cas, il ne
passe pas par mon constructeur par recopie !?

Parce que, dans le deuxieme cas, il ne s'agit pas de construction par
copie mais d'affectation. Et si tu ne fais rien, le compilateur te
donnes une version par defaut qui ne conviendra pas dans le cas present.

Donc, il te faudrait dans ta classe pile_entier une fonction avec le
prototype suivant:

void pile_entier::operator=( pile_entier const& p );


Merci. Ces explications sont parfaitement limpide !

Quote:
Mais bon... pourquoi ne pas encapsuler un std::vector<int> dans la
classe pile_entier ? Ca aurait l'avantage de laisser de coté ce genre de
problemes. Et tant qu'a faire, vu le nom de la classe, il y a aussi
std::stack<int> qui doit convenir.

C'est simplement parce que j'apprends le C++ Smile
Merci pour ces réponses.

TSalm
Back to top
Michel Decima
Guest





PostPosted: Wed Apr 11, 2007 8:25 pm    Post subject: Re: [noob] Constructeur par recopie Reply with quote

TSalm a écrit :

Quote:
Merci. Ces explications sont parfaitement limpide !

De rien. C'est un probleme classique au debut, après on s'y fait.

Quote:
Mais bon... pourquoi ne pas encapsuler un std::vector<int> dans la
classe pile_entier ? Ca aurait l'avantage de laisser de coté ce genre de
problemes. Et tant qu'a faire, vu le nom de la classe, il y a aussi
std::stack<int> qui doit convenir.

C'est simplement parce que j'apprends le C++ Smile

A moins que l'utilisation de pointeurs ne soit imposée, je te conseille
fortement de regarder std::vector<int>, ca ira plus vite pour la suite.
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.