Salut, j'ai un petit problème de C++
J'ai une classe avec un opérateur =, et deux autres classes (_b et _c)
qui dérivent de cette classe. J'essaie de faire _b = _b + _c, mais ca
ne marche pas. Dans l'operateur =, c'est bon (je le sais après avoir
debuggé), mais quand je retourne au contexte appelant, mon objet ne
conserve pas les données.
Quelqu'un peut'il m'aider ? Pleeeeeeease....
Salut, j'ai un petit problème de C++
J'ai une classe avec un opérateur =, et deux autres classes (_b et _c)
qui dérivent de cette classe. J'essaie de faire _b = _b + _c, mais ca
ne marche pas. Dans l'operateur =, c'est bon (je le sais après avoir
debuggé), mais quand je retourne au contexte appelant, mon objet ne
conserve pas les données.
Quelqu'un peut'il m'aider ? Pleeeeeeease....
Salut, j'ai un petit problème de C++
J'ai une classe avec un opérateur =, et deux autres classes (_b et _c)
qui dérivent de cette classe. J'essaie de faire _b = _b + _c, mais ca
ne marche pas. Dans l'operateur =, c'est bon (je le sais après avoir
debuggé), mais quand je retourne au contexte appelant, mon objet ne
conserve pas les données.
Quelqu'un peut'il m'aider ? Pleeeeeeease....
(emmanuel) writes:Salut, j'ai un petit problème de C++
J'ai une classe avec un opérateur =, et deux autres classes (_b et _c)
qui dérivent de cette classe. J'essaie de faire _b = _b + _c, mais ca
ne marche pas. Dans l'operateur =, c'est bon (je le sais après avoir
debuggé), mais quand je retourne au contexte appelant, mon objet ne
conserve pas les données.
Quelqu'un peut'il m'aider ? Pleeeeeeease....
Peux-tu donner un exemple complet, ce que tu obtiens et ce à quoi tu
t'attendais?
A+
emmanuel.rauturier@adpcl.com (emmanuel) writes:
Salut, j'ai un petit problème de C++
J'ai une classe avec un opérateur =, et deux autres classes (_b et _c)
qui dérivent de cette classe. J'essaie de faire _b = _b + _c, mais ca
ne marche pas. Dans l'operateur =, c'est bon (je le sais après avoir
debuggé), mais quand je retourne au contexte appelant, mon objet ne
conserve pas les données.
Quelqu'un peut'il m'aider ? Pleeeeeeease....
Peux-tu donner un exemple complet, ce que tu obtiens et ce à quoi tu
t'attendais?
A+
(emmanuel) writes:Salut, j'ai un petit problème de C++
J'ai une classe avec un opérateur =, et deux autres classes (_b et _c)
qui dérivent de cette classe. J'essaie de faire _b = _b + _c, mais ca
ne marche pas. Dans l'operateur =, c'est bon (je le sais après avoir
debuggé), mais quand je retourne au contexte appelant, mon objet ne
conserve pas les données.
Quelqu'un peut'il m'aider ? Pleeeeeeease....
Peux-tu donner un exemple complet, ce que tu obtiens et ce à quoi tu
t'attendais?
A+
Alors en fait, j'ai plus ou moins trouvé une solution à mon problème,
mais sans vraiment comprendre ce qui se passe ; il manquait le "&"
dans A &A
A &A::operator+(const A &AToAdd)
Alors en fait, j'ai plus ou moins trouvé une solution à mon problème,
mais sans vraiment comprendre ce qui se passe ; il manquait le "&"
dans A &A
A &A::operator+(const A &AToAdd)
Alors en fait, j'ai plus ou moins trouvé une solution à mon problème,
mais sans vraiment comprendre ce qui se passe ; il manquait le "&"
dans A &A
A &A::operator+(const A &AToAdd)
Jean-Marc Bourguet wrote in message news:...(emmanuel) writes:Salut, j'ai un petit problème de C++
J'ai une classe avec un opérateur =, et deux autres classes (_b et _c)
qui dérivent de cette classe. J'essaie de faire _b = _b + _c, mais ca
ne marche pas. Dans l'operateur =, c'est bon (je le sais après avoir
debuggé), mais quand je retourne au contexte appelant, mon objet ne
conserve pas les données.
Quelqu'un peut'il m'aider ? Pleeeeeeease....
Peux-tu donner un exemple complet, ce que tu obtiens et ce à quoi tu
t'attendais?
A+
En gros c'était comme ceci :
class A {
...
A operator+( const A & );
void operator=(const A & );
};
Jean-Marc Bourguet <jm@bourguet.org> wrote in message news:<avndib.b11.ln@news.bourguet.org>...
emmanuel.rauturier@adpcl.com (emmanuel) writes:
Salut, j'ai un petit problème de C++
J'ai une classe avec un opérateur =, et deux autres classes (_b et _c)
qui dérivent de cette classe. J'essaie de faire _b = _b + _c, mais ca
ne marche pas. Dans l'operateur =, c'est bon (je le sais après avoir
debuggé), mais quand je retourne au contexte appelant, mon objet ne
conserve pas les données.
Quelqu'un peut'il m'aider ? Pleeeeeeease....
Peux-tu donner un exemple complet, ce que tu obtiens et ce à quoi tu
t'attendais?
A+
En gros c'était comme ceci :
class A {
...
A operator+( const A & );
void operator=(const A & );
};
Jean-Marc Bourguet wrote in message news:...(emmanuel) writes:Salut, j'ai un petit problème de C++
J'ai une classe avec un opérateur =, et deux autres classes (_b et _c)
qui dérivent de cette classe. J'essaie de faire _b = _b + _c, mais ca
ne marche pas. Dans l'operateur =, c'est bon (je le sais après avoir
debuggé), mais quand je retourne au contexte appelant, mon objet ne
conserve pas les données.
Quelqu'un peut'il m'aider ? Pleeeeeeease....
Peux-tu donner un exemple complet, ce que tu obtiens et ce à quoi tu
t'attendais?
A+
En gros c'était comme ceci :
class A {
...
A operator+( const A & );
void operator=(const A & );
};
Quelqu'un peut'il m'aider ? Pleeeeeeease....
Peux-tu donner un exemple complet, ce que tu obtiens et ce à quoi tu
t'attendais?
A+
En gros c'était comme ceci :
void A::operator=(const A & );
Quelqu'un peut'il m'aider ? Pleeeeeeease....
Peux-tu donner un exemple complet, ce que tu obtiens et ce à quoi tu
t'attendais?
A+
En gros c'était comme ceci :
void A::operator=(const A & );
Quelqu'un peut'il m'aider ? Pleeeeeeease....
Peux-tu donner un exemple complet, ce que tu obtiens et ce à quoi tu
t'attendais?
A+
En gros c'était comme ceci :
void A::operator=(const A & );
Le code "complet" de operator = est le suivant
A& operator= (const A& a)
{
if (this != &a)
{
// Affectation
}
return *this;
}
Le if permet de gerer le cas X = X
le return permet le chainage des
Ce code n'est plus vraiment en vogue depuis que les gens essayent de
Le code "complet" de operator = est le suivant
A& operator= (const A& a)
{
if (this != &a)
{
// Affectation
}
return *this;
}
Le if permet de gerer le cas X = X
le return permet le chainage des
Ce code n'est plus vraiment en vogue depuis que les gens essayent de
Le code "complet" de operator = est le suivant
A& operator= (const A& a)
{
if (this != &a)
{
// Affectation
}
return *this;
}
Le if permet de gerer le cas X = X
le return permet le chainage des
Ce code n'est plus vraiment en vogue depuis que les gens essayent de
emmanuel wrote:Quelqu'un peut'il m'aider ? Pleeeeeeease....
Peux-tu donner un exemple complet, ce que tu obtiens et ce à quoi tu
t'attendais?
En gros c'était comme ceci :
En detail ca donne quoi.
Si on ne sait pas ce que font tes classes en interne on va avoir du
mal.
Je peux signaler une erreur flagrante cependant :void A::operator=(const A & );
Le prototype exact est A& operator= (const A &);
Ca permet d'avoir des ecriture du style X = Y = Z = ...
Mais l'origine de ton probleme n'est pas la.
Le code "complet" de operator = est le suivant
A& operator= (const A& a)
{
if (this != &a)
{
// Affectation
}
return *this;
}
Le if permet de gerer le cas X = X le return permet le chainage des
La nécessité d'un test pour l'auto-affectation est en général une
emmanuel wrote:
Quelqu'un peut'il m'aider ? Pleeeeeeease....
Peux-tu donner un exemple complet, ce que tu obtiens et ce à quoi tu
t'attendais?
En gros c'était comme ceci :
En detail ca donne quoi.
Si on ne sait pas ce que font tes classes en interne on va avoir du
mal.
Je peux signaler une erreur flagrante cependant :
void A::operator=(const A & );
Le prototype exact est A& operator= (const A &);
Ca permet d'avoir des ecriture du style X = Y = Z = ...
Mais l'origine de ton probleme n'est pas la.
Le code "complet" de operator = est le suivant
A& operator= (const A& a)
{
if (this != &a)
{
// Affectation
}
return *this;
}
Le if permet de gerer le cas X = X le return permet le chainage des
La nécessité d'un test pour l'auto-affectation est en général une
emmanuel wrote:Quelqu'un peut'il m'aider ? Pleeeeeeease....
Peux-tu donner un exemple complet, ce que tu obtiens et ce à quoi tu
t'attendais?
En gros c'était comme ceci :
En detail ca donne quoi.
Si on ne sait pas ce que font tes classes en interne on va avoir du
mal.
Je peux signaler une erreur flagrante cependant :void A::operator=(const A & );
Le prototype exact est A& operator= (const A &);
Ca permet d'avoir des ecriture du style X = Y = Z = ...
Mais l'origine de ton probleme n'est pas la.
Le code "complet" de operator = est le suivant
A& operator= (const A& a)
{
if (this != &a)
{
// Affectation
}
return *this;
}
Le if permet de gerer le cas X = X le return permet le chainage des
La nécessité d'un test pour l'auto-affectation est en général une
A& operator= (A const &a)
{
A temp(a);
swap(temp);
}
A& operator= (A const &a)
{
A temp(a);
swap(temp);
}
A& operator= (A const &a)
{
A temp(a);
swap(temp);
}
En gros c'était comme ceci :
class A {
...
A operator+( const A & );
void operator=(const A & );
};
B : public A {
};
C : public A {
};
A A::operator+(const A &AToAdd)
{
A toRet;
... // init this = this + AToAdd
return toRet;
}
void A::operator=(const A& AToCopy)
{
... // copy this = AToCopy
}
B _b;
C _c;
_c = _c + _b;
// Ici j'avais mon problème ; le _c final ne changeait pas d'état.
Alors en fait, j'ai plus ou moins trouvé une solution à mon problème,
mais sans vraiment comprendre ce qui se passe ; il manquait le "&"
dans A &A
A &A::operator+(const A &AToAdd)
J'ai surtout utilisé le "&" en C pour avoir l'adresse d'un objet. J'ai
plus ou moins compris le const ... & (qui pour moi reste une facilité
d'utilisation/substitution par rapport au passage d'adresse)(me
trompe-je ???), mais là dans ce contexte, je comprends pas du tout.
Surtout que je ne vois toujours pas très bien mon problème. Mon
operateur + utilise une variable locale, mais n'est-elle pas sensé
être recopiée en mémoire dans un nouvel objet quand on fait le return
? Et surtout je ne vois pas bien pourquoi l'opérateur = ne fonctionne
pas. Et que fait exactement ce %*$# "&" ?
En gros c'était comme ceci :
class A {
...
A operator+( const A & );
void operator=(const A & );
};
B : public A {
};
C : public A {
};
A A::operator+(const A &AToAdd)
{
A toRet;
... // init this = this + AToAdd
return toRet;
}
void A::operator=(const A& AToCopy)
{
... // copy this = AToCopy
}
B _b;
C _c;
_c = _c + _b;
// Ici j'avais mon problème ; le _c final ne changeait pas d'état.
Alors en fait, j'ai plus ou moins trouvé une solution à mon problème,
mais sans vraiment comprendre ce qui se passe ; il manquait le "&"
dans A &A
A &A::operator+(const A &AToAdd)
J'ai surtout utilisé le "&" en C pour avoir l'adresse d'un objet. J'ai
plus ou moins compris le const ... & (qui pour moi reste une facilité
d'utilisation/substitution par rapport au passage d'adresse)(me
trompe-je ???), mais là dans ce contexte, je comprends pas du tout.
Surtout que je ne vois toujours pas très bien mon problème. Mon
operateur + utilise une variable locale, mais n'est-elle pas sensé
être recopiée en mémoire dans un nouvel objet quand on fait le return
? Et surtout je ne vois pas bien pourquoi l'opérateur = ne fonctionne
pas. Et que fait exactement ce %*$# "&" ?
En gros c'était comme ceci :
class A {
...
A operator+( const A & );
void operator=(const A & );
};
B : public A {
};
C : public A {
};
A A::operator+(const A &AToAdd)
{
A toRet;
... // init this = this + AToAdd
return toRet;
}
void A::operator=(const A& AToCopy)
{
... // copy this = AToCopy
}
B _b;
C _c;
_c = _c + _b;
// Ici j'avais mon problème ; le _c final ne changeait pas d'état.
Alors en fait, j'ai plus ou moins trouvé une solution à mon problème,
mais sans vraiment comprendre ce qui se passe ; il manquait le "&"
dans A &A
A &A::operator+(const A &AToAdd)
J'ai surtout utilisé le "&" en C pour avoir l'adresse d'un objet. J'ai
plus ou moins compris le const ... & (qui pour moi reste une facilité
d'utilisation/substitution par rapport au passage d'adresse)(me
trompe-je ???), mais là dans ce contexte, je comprends pas du tout.
Surtout que je ne vois toujours pas très bien mon problème. Mon
operateur + utilise une variable locale, mais n'est-elle pas sensé
être recopiée en mémoire dans un nouvel objet quand on fait le return
? Et surtout je ne vois pas bien pourquoi l'opérateur = ne fonctionne
pas. Et que fait exactement ce %*$# "&" ?
Salut, 2 ou 3 réponses:
Ton opérateur + devrait ressembler à
-----------------------------------------------
A& A::operator+(const A& AToAdd){
.....
A* Res = new A(....);
return *Res;
}
------------------------------------------------
--> A* Res = new A(...) crée un pointeur à un objet de type A. Mais
comme c'est le contenu du pointeur (et non l'adresse) que tu veux que
ta fonction rende, ton type de retour doit être doit être un
alias(référence). Alors pourquoi pas:
----------------------------------------
A A::operator+(const A& AToAdd){
.....
A* Res = new A(....);
return *Res;
}
ou même:
------------------------------------------
A A::operator+(const A& AToAdd){
.....
A Res (....);
return Res;
}
----------------------------------------
?parce que si tu fais ca, tu doit faire un appel de constructeur copie
(que tu n'as pas l'air d'avoir implémenté). L'appel se fait au niveau
de la commande `return`.
Ton objet ne sait pas ce que ca veut dire d'avoir une valeur. il ne
sait pas comment se copier sur le stack, ce qui se fait
automatiquement lors d'un appel return. Si le 1er cas marchait, tu
perdrais la mémoire alloué en +.
Finalement, ceci ne marche pas/est très dangereux:
-----------------------------------------------
A& A::operator+(const A& AToAdd){
.....
A Res (....);
return Res;
}
------------------------------------------------
Parce que Res ne t'appartient + en sortant de ta fonction, et la
mémoire retourne au system. Tu retournerai une référence à 1 truc sur
lequel tu n'as + aucun controle.
Salut, 2 ou 3 réponses:
Ton opérateur + devrait ressembler à
-----------------------------------------------
A& A::operator+(const A& AToAdd){
.....
A* Res = new A(....);
return *Res;
}
------------------------------------------------
--> A* Res = new A(...) crée un pointeur à un objet de type A. Mais
comme c'est le contenu du pointeur (et non l'adresse) que tu veux que
ta fonction rende, ton type de retour doit être doit être un
alias(référence). Alors pourquoi pas:
----------------------------------------
A A::operator+(const A& AToAdd){
.....
A* Res = new A(....);
return *Res;
}
ou même:
------------------------------------------
A A::operator+(const A& AToAdd){
.....
A Res (....);
return Res;
}
----------------------------------------
?parce que si tu fais ca, tu doit faire un appel de constructeur copie
(que tu n'as pas l'air d'avoir implémenté). L'appel se fait au niveau
de la commande `return`.
Ton objet ne sait pas ce que ca veut dire d'avoir une valeur. il ne
sait pas comment se copier sur le stack, ce qui se fait
automatiquement lors d'un appel return. Si le 1er cas marchait, tu
perdrais la mémoire alloué en +.
Finalement, ceci ne marche pas/est très dangereux:
-----------------------------------------------
A& A::operator+(const A& AToAdd){
.....
A Res (....);
return Res;
}
------------------------------------------------
Parce que Res ne t'appartient + en sortant de ta fonction, et la
mémoire retourne au system. Tu retournerai une référence à 1 truc sur
lequel tu n'as + aucun controle.
Salut, 2 ou 3 réponses:
Ton opérateur + devrait ressembler à
-----------------------------------------------
A& A::operator+(const A& AToAdd){
.....
A* Res = new A(....);
return *Res;
}
------------------------------------------------
--> A* Res = new A(...) crée un pointeur à un objet de type A. Mais
comme c'est le contenu du pointeur (et non l'adresse) que tu veux que
ta fonction rende, ton type de retour doit être doit être un
alias(référence). Alors pourquoi pas:
----------------------------------------
A A::operator+(const A& AToAdd){
.....
A* Res = new A(....);
return *Res;
}
ou même:
------------------------------------------
A A::operator+(const A& AToAdd){
.....
A Res (....);
return Res;
}
----------------------------------------
?parce que si tu fais ca, tu doit faire un appel de constructeur copie
(que tu n'as pas l'air d'avoir implémenté). L'appel se fait au niveau
de la commande `return`.
Ton objet ne sait pas ce que ca veut dire d'avoir une valeur. il ne
sait pas comment se copier sur le stack, ce qui se fait
automatiquement lors d'un appel return. Si le 1er cas marchait, tu
perdrais la mémoire alloué en +.
Finalement, ceci ne marche pas/est très dangereux:
-----------------------------------------------
A& A::operator+(const A& AToAdd){
.....
A Res (....);
return Res;
}
------------------------------------------------
Parce que Res ne t'appartient + en sortant de ta fonction, et la
mémoire retourne au system. Tu retournerai une référence à 1 truc sur
lequel tu n'as + aucun controle.