IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Histoire d'heritage - qualité de code


Sujet :

C++

  1. #1
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut Histoire d'heritage - qualité de code
    Bonjour,

    que pensez-vous de ce code ? Je ne l'ai pas compilé, mais il me semble qu'a l'execution, il y a un problème au niveau de la destruction de l'element bo_test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    class Gel;
     
    class Gco
    {
    	public:
    	Gco();
    	~Gco();
    	void add(Gel *p);
     
    	protected:
    	Gel* pGel;
    }
     
    Gco::Gco()
    {
    }
     
    Gco::~Gco()
    {
    	if(pGel)
                 delete pGel;
    }
     
    void Gco::add(Gel* p)
    {
    	pGel = p;
    }
     
    class Gel : public Gco
    {
    	protected:
    	int x;
    }
     
    class Gbo : public Gel
    {
    	private:
    	int y;
    }
     
    class Gbu : public Gel
    {
    	private:
    	int z;
    }
     
    int main()
    {
    	Gbo* bo_test = new Gbo;
    	Gbu* bu_test = new Gbu;
     
    	bo_test->add(bu_test);
     
    	delete bo_test;
     
    	return 0;
    }
    merci !
    Ubuntu fan depuis la 8.04
    monnaie libre

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Dans le constructeur de Gco, le pointeur pGel n'est pas initialisé à NULL donc si tu construis un objet et le détuis immédiatement, tu fais un delete sur n'importe quoi.

    De plus, vu qu'il y a un pointeur dans les membres de la classe, il faudrait peut être/certainement instancier le constructeur de copie et l'opérateur d'affectation (je suis moins sûr pour ce dernier)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En effet, il y a un problème de destruction, car le destructeur est public et non-virtuel.
    --> Le destructeur de Gel doit être virtuel.

    De plus, comme le dit ram-0000, il faut un constructeur de copie et un opérateur d'affectation explicite: La classe doit soit être parfaitement copiable, soit explicitement non-copiable (constructeur de copie et opérateurs d'affectation déclarés private et non-définis).

    De plus, la fonction Add() ne fait pas ce qu'elle dit, vu qu'elle entraine un bug si elle est appelée deux fois.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    merci !

    et petite question bete...

    puis-je au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Gel : public Gco
    {
    	protected:
    	int x;
    }
    faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Gel
    {
            public:
            Gco m_gco;
    	protected:
    	int x;
    }
    Ubuntu fan depuis la 8.04
    monnaie libre

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je ne vois pas pourquoi tu ne pourrais pas.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Lis donc ces articles :
    -> Héritage 1
    -> Héritage 2
    Tu semble typiquement te poser la question entre IS-A et IS-IMPLEMENTED-IN-TERMS-OF.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Salut,
    Citation Envoyé par Katian Voir le message
    merci !

    et petite question bete...

    puis-je au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Gel : public Gco
    {
    	protected:
    	int x;
    }
    faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Gel
    {
            public:
            Gco m_gco;
    	protected:
    	int x;
    }
    Pour faire simple, il faut savoir que la relation d'héritage est la relation la plus forte que tu puisse trouver en programmation orientée objet.

    On dit souvent que l'héritage est une relation EST-UN(E) (an IS-A relation)

    J'aime à présenter les choses sous la forme de
    L'héritage (public) se justifie si tu peux sémantiquement dire que l'objet dérivé est un type particulier de l'objet de base
    En effet, il est - finalement - très facile de changer une relation EST-UN(E) en une relation du genre de "A-TOUTES-LES-CARACTERISTIQUES-D-UN(E)" qui impliquerait plutôt une agrégation, voire de confondre une relation EST-UN(E) avec une relation du type EST-IMPLEMETE(E)-EN-TERME-DE...

    Le principe général (bien qu'il souffre de pas mal d'exception) est donc à la limite de préférer l'agrégation chaque fois qu'il est possible de l'envisager, et de n'utiliser l'héritage que s'il n'y a vraiment pas d'autre solution (entre autre, si tu veux pouvoir faire passer un objet du type dérivé pour... un objet du type de base, voire, faire cohabiter plusieurs objet de types dérivés différents dans une même collections d'objets)

    Je m'explique (et l'explication risque d'être un peu plus compliquée :aie):
    Un véhicule (générique) pourrait avoir comme états/propriétés le fait qu'il soit en mouvement ou non, la vitesse actuelle l'orientation du déplacement, le sens du déplacement

    Il devrait aussi présenter des comportements permettant de modifier la vitesse, l'orientation du déplacement ou le sens du déplacement (sans oublier le fait de s'arrêter complètement)

    Si nous n'envisageons de travailler qu'avec des voitures, nous pouvons dire qu'une voiture "a toutes les caractéristiques" d'un véhicule, et donc nous baser sur une agrégation simple, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Voiture
    {
        public:
            Vehicule& getVehicule();
        private:
            Vehicule v;
    };
    Si nous décidons de rajouter des camions, mais qu'un camion ne doit jamais cohabiter dans une collection avec une voiture, nous pouvons rester dans le principe d'une relation "a toutes les caractéristiques de" pour notre camion (et donc fournir une classe camion ressemblant fortement à notre classe voiture).

    Si, par contre, tu veux pouvoir utiliser une collection de véhicules sans tenir compte qu'un des éléments de cette collection est spécifiquement un camion ou une voiture, il faudra que la classe camion et la classe voiture dérivent explicitement d'une classe de base identique: la classe Vehicule

    Mais, cela implique que, lorsque tu manipulera les éléments de cette collection, tu ne pourra - a priori - utiliser que les méthodes propres... aux véhicules, et que tu ne pourra pas essayer d'accéder à une méthode qui serait, par exemple, propre aux camions (du moins, sans passer par une conversion), et cela, même si les méthodes de la classe Vehicule peuvent adopter un comportement polymorphe.

    Evidemment, cela peut impliquer d'avoir une idée relativement précise des besoins réels (voir de l'évolution des besoins) au moment de choisir entre une agrégation et l'héritage
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    dans le destructeur de Gco, du delete un pointeur vers un Gel alors que la classe est forward déclaré et non définie. Ca ne va pas marcher.
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  9. #9
    Membre régulier

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 82
    Points
    82
    Billets dans le blog
    1
    Par défaut
    merci a vous

    koala01, ton explication est très claire ! j'y vois mieux maintenant !
    Ubuntu fan depuis la 8.04
    monnaie libre

Discussions similaires

  1. verifier la qualite du code Java ?
    Par _vince_ dans le forum Général Java
    Réponses: 5
    Dernier message: 01/04/2008, 23h31
  2. Mapping annotation une histoire d'heritage :)
    Par nadhem dans le forum Hibernate
    Réponses: 1
    Dernier message: 17/03/2008, 12h08
  3. [Visual Web] visual web et qualité du code
    Par robert_trudel dans le forum NetBeans
    Réponses: 4
    Dernier message: 11/12/2006, 13h11
  4. qualité du code
    Par clementphp dans le forum Langage
    Réponses: 6
    Dernier message: 10/07/2006, 15h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo