 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Simon Lipp Guest
|
Posted: Wed May 17, 2006 6:21 pm Post subject: référence et constructeur par défaut... |
|
|
Bonjour,
Je dois actuellement modifier un gros programme, dont l'auteur a disparu
dans la nature...
Pour l'instant, mon but est de réussir à le porter (Windows->Linux) sans
trop de casse (cad ne me dites pas de revoir complètement l'architecture
générale, je le ferais, mais plus tard, quand j'aurais à peu près compris
comment ça marche )
Ca passe impec, sauf un petit problème avec G++ qui ne veut pas compiler
quelque chose qu'apparement Visual C++ acceptait. J'en ai fait un simple
résumé sur le code source suivant:
class Padawan {
public:
Padawan() { }
};
class Instructor {
Padawan& m_bizut;
public:
Instructor(Padawan& p): m_bizut(p) { }
};
class Jedi: protected Instructor {
public:
Jedi(): Instructor(Padawan()) { }
};
En gros, j'aimerais donner class Padawan {
public:
Padawan() { }
};
class Instructor {
Padawan& m_bizut;
public:
Instructor(Padawan& p): m_bizut(p) { }
};
class Jedi: protected Instructor {
public:
Jedi(): Instructor(Padawan()) { }
};
Quelqu'un aurait il une idée un peu plus belle que remplacer
Jedi(): Instructor(Padawan()) { }
par
Jedi(): Instructor(*(new Padawan)) { }
pour le faire compiler par G++ ? (parce ma méthode, en plus d'être moche,
donne des fuites de mémoire)
Si vous réussissez à me donner une piste (autre que "recode tout"), je vous
en serait éternellement reconnaissant
Merci d'avance  |
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Thu May 18, 2006 9:14 am Post subject: Re: référence et constructeur par défaut... |
|
|
Le 17-05-2006, Simon Lipp <moonz@no-log.org> a écrit :
| Quote: | Bonjour,
Je dois actuellement modifier un gros programme, dont l'auteur a disparu
dans la nature...
Pour l'instant, mon but est de réussir à le porter (Windows->Linux) sans
trop de casse (cad ne me dites pas de revoir complètement l'architecture
générale, je le ferais, mais plus tard, quand j'aurais à peu près compris
comment ça marche )
Ca passe impec, sauf un petit problème avec G++ qui ne veut pas compiler
quelque chose qu'apparement Visual C++ acceptait. J'en ai fait un simple
résumé sur le code source suivant:
class Padawan {
public:
Padawan() { }
};
class Instructor {
Padawan& m_bizut;
|
Pourquoi donc ?
James t'en parlera mieux que moi, mais avoir des références
membres est si j'ai bien retenu une mauvaise idée en général.
Il y a des problèmes sur les opérations de copie, ce
genre de chose.
D'autant que là, tu cherches à avoir une référence sur un
temporaire.
Donc, choisi ton camps: Padawan ou Padawan*.
| Quote: | Si vous réussissez à me donner une piste (autre que "recode tout"), je vous
en serait éternellement reconnaissant
|
--------- Version Padawan (composition en UML) -----
class Padawan {
public:
Padawan() { }
};
class Instructor {
Padawan m_bizut;
public:
Instructor(const Padawan& p): m_bizut(p) { }
};
class Jedi: protected Instructor {
public:
Jedi(): Instructor(Padawan()) { }
};
--------- Version Padawan* (aggrégation en UML) -----
class Padawan {
public:
Padawan() { }
};
class Instructor {
Padawan* m_bizut;
public:
Instructor(Padawan* p): m_bizut(p) { }
};
class Jedi: protected Instructor {
public:
Jedi(): Instructor( new Padawan()) { }
};
Les deux compilent (avec mon g++ (GCC) 4.0.2),
mais la sémantique de la relation est différente.
Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard) |
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Thu May 18, 2006 11:56 am Post subject: Re: référence et constructeur par défaut... |
|
|
Le 18-05-2006, Simon Lipp <moonz@no-log.org> a écrit :
| Quote: | Donc, choisi ton camps: Padawan ou Padawan*.
Comme je l'ai dit, le programme est déjà fait. Je choisirais mon camps quand
il tournera et que je pourrais tester si mes modifications font tout
planter ou pas - quand je pourrait vraiment debugger, là je suis seulement
dans la phase le faire compiler. Si je modifie trop de trucs avant de
tester si ça marche, je pourrais pas savoir ce qui a tout pété. Je n'ai, à
l'heure actuelle, aucun moyen de mesurer les conséquences du changement de
Padawan& et Padawan ou Padawan...
|
Sans rien savoir du contexte, je miserais plutôt
sur un Padawan*.
| Quote: | --------- Version Padawan (composition en UML) -----
class Padawan {
public:
Padawan() { }
};
class Instructor {
Padawan m_bizut;
public:
Instructor(const Padawan& p): m_bizut(p) { }
};
class Jedi: protected Instructor {
public:
Jedi(): Instructor(Padawan()) { }
};
Très bien. Supposons que Instructor aie à modifier Padawan. Jedi s'en
contrefout, mais on peut imaginer une fonction de ce type:
void instruct(Padawan& p) {
Instructor i(p);
i.learn_mathematics(); // modifie p
}
Avec la version Padawan&, pas de problème, le padawan connaitra les maths.
Avec la version Padawan, aucune chance...
|
Avec la version Padawan*, il les connaitra aussi.
| Quote: | --------- Version Padawan* (aggrégation en UML) -----
class Padawan {
public:
Padawan() { }
};
class Instructor {
Padawan* m_bizut;
public:
Instructor(Padawan* p): m_bizut(p) { }
};
class Jedi: protected Instructor {
public:
Jedi(): Instructor( new Padawan()) { }
};
Oui, mais dans ce cas, qui doit détruire m_bizut ?
|
Ben, celui qui le construit, c'est à dire Jedi.
~Jedi(){
delete m_bizut;
}
| Quote: | Bon, vivement que ça tourne, que je puisse modifier tout ça ;)
PS: désolé d'avoir répondu par mail, je me suis planté d'icone (j'aime pas
akregator )
|
Tant pis pour toi: j'ai une adresse .invalid.
Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard) |
|
| Back to top |
|
 |
Simon Lipp Guest
|
Posted: Thu May 18, 2006 12:22 pm Post subject: Re: référence et constructeur par défaut... |
|
|
| Quote: | D'autant que là, tu cherches à avoir une référence sur un
temporaire.
J'ai bien compris que le problème venait d'ici  |
| Quote: | Donc, choisi ton camps: Padawan ou Padawan*.
Comme je l'ai dit, le programme est déjà fait. Je choisirais mon camps quand |
il tournera et que je pourrais tester si mes modifications font tout
planter ou pas - quand je pourrait vraiment debugger, là je suis seulement
dans la phase le faire compiler. Si je modifie trop de trucs avant de
tester si ça marche, je pourrais pas savoir ce qui a tout pété. Je n'ai, à
l'heure actuelle, aucun moyen de mesurer les conséquences du changement de
Padawan& et Padawan ou Padawan...
| Quote: | --------- Version Padawan (composition en UML) -----
class Padawan {
public:
Padawan() { }
};
class Instructor {
Padawan m_bizut;
public:
Instructor(const Padawan& p): m_bizut(p) { }
};
class Jedi: protected Instructor {
public:
Jedi(): Instructor(Padawan()) { }
};
Très bien. Supposons que Instructor aie à modifier Padawan. Jedi s'en |
contrefout, mais on peut imaginer une fonction de ce type:
void instruct(Padawan& p) {
Instructor i(p);
i.learn_mathematics(); // modifie p
}
Avec la version Padawan&, pas de problème, le padawan connaitra les maths.
Avec la version Padawan, aucune chance...
| Quote: | --------- Version Padawan* (aggrégation en UML) -----
class Padawan {
public:
Padawan() { }
};
class Instructor {
Padawan* m_bizut;
public:
Instructor(Padawan* p): m_bizut(p) { }
};
class Jedi: protected Instructor {
public:
Jedi(): Instructor( new Padawan()) { }
};
Oui, mais dans ce cas, qui doit détruire m_bizut ? |
Ca ne peut être Instructor: la plupart du temps, p était une référence (donc
maintenant un pointeur) sur une variable locale. Si Instructor le détruit,
je vais me taper des segfault qui viendront de je ne sais trop où
Comme c'est une variable locale, je pourrais me dire que pas besoin de la
détruire. Mais le problème, c'est alors le
| Quote: | Jedi(): Instructor( new Padawan()) { }
qui me donnera une belle fuite de mémoire... |
Bon, vivement que ça tourne, que je puisse modifier tout ça ;)
PS: désolé d'avoir répondu par mail, je me suis planté d'icone (j'aime pas
akregator ) |
|
| Back to top |
|
 |
Marc Duflot Guest
|
Posted: Thu May 18, 2006 12:22 pm Post subject: Re: référence et constructeur par dé faut... |
|
|
Simon Lipp wrote:
| Quote: | class Padawan {
public:
Padawan() { }
};
class Instructor {
Padawan& m_bizut;
public:
Instructor(Padawan& p): m_bizut(p) { }
};
class Jedi: protected Instructor {
public:
Jedi(): Instructor(Padawan()) { }
};
Quelqu'un aurait il une idée un peu plus belle que remplacer
Jedi(): Instructor(Padawan()) { }
par
Jedi(): Instructor(*(new Padawan)) { }
pour le faire compiler par G++ ? (parce ma méthode, en plus d'être moche,
donne des fuites de mémoire)
|
Ce n'est pas propre mais si tu n'es autorisé qu'à modifier Jedi, tu peux
t'en sortir avec un héritage privé :
class Jedi: private Padawan, protected Instructor {
public:
Jedi(): Instructor((Padawan&)*this) { }
}; |
|
| Back to top |
|
 |
Simon Lipp Guest
|
Posted: Thu May 18, 2006 12:22 pm Post subject: Re: référence et constructeur par défaut... |
|
|
| Quote: | Oui, mais dans ce cas, qui doit détruire m_bizut ?
Ben, celui qui le construit, c'est à dire Jedi.
Ya des jours où je me sens bête, et ya des jours tout les jours, comme |
dirait l'autre
On va mettre ça sur le compte d'une accumulation de fatigue et de stress,
hein (non, je n'ai pas bu...)
Bon, je vais faire comme ça, merci beaucoup  |
|
| Back to top |
|
 |
|
|
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
|
|