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 

référence et constructeur par défaut...

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





PostPosted: Wed May 17, 2006 6:21 pm    Post subject: référence et constructeur par défaut... Reply with 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 Wink)
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 Wink
Back to top
Marc Boyer
Guest





PostPosted: Thu May 18, 2006 9:14 am    Post subject: Re: référence et constructeur par défaut... Reply with quote



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 Wink)
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





PostPosted: Thu May 18, 2006 11:56 am    Post subject: Re: référence et constructeur par défaut... Reply with quote



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 Wink)

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





PostPosted: Thu May 18, 2006 12:22 pm    Post subject: Re: référence et constructeur par défaut... Reply with quote

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 Wink


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ù Wink
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 Wink)
Back to top
Marc Duflot
Guest





PostPosted: Thu May 18, 2006 12:22 pm    Post subject: Re: référence et constructeur par dé faut... Reply with quote

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





PostPosted: Thu May 18, 2006 12:22 pm    Post subject: Re: référence et constructeur par défaut... Reply with quote

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 Wink
On va mettre ça sur le compte d'une accumulation de fatigue et de stress,
hein Wink (non, je n'ai pas bu...)

Bon, je vais faire comme ça, merci beaucoup Smile
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.