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 :

Héritage : Arbres binaires


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Héritage : Arbres binaires
    Bonjour à tous.
    J'essaye d'implémenter deux arbres binaires, l'un en une liste, l'autre en un vecteur, ces derniers étant deux sous classes d'une classe abstraite.

    Voici le code de ce qui pose problème :
    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
     
    class Arbre2{
      public:
        class Elem{
          public:
    	friend class Arbre2;
    	int info;
    	virtual const Elem& elemGauche(const Elem &)=0;
    	Elem();
        };
     
     
    	virtual const Elem & filsGauche(const Elem &)=0;			Arbre2();							
    	//Arbre2(const Arbre2&);						//~Arbre2();														
    	private:
    	   Elem* Rac;												
     
    };
     
     
    class Arbre2L : public Arbre2{
      public:
        class ElemL : public Elem{
    	public:
    	  friend class Arbre2L;
    	  int info;
    	  ElemL *fg,*fd,*pere;
    	  ElemL(int,ElemL*,ElemL*);		
    	};
     
     
    	const ElemL & filsGauche(const Elem &);										
    	Arbre2L();							~Arbre2L();													
     
    	private:
    		ElemL* RacL;
    		void Cancel(ElemL*);
    		const ElemL& Copie(const ElemL &);
    };
     
    const Arbre2L::ElemL& Arbre2L::filsGauche(const Arbre2L::Elem& p){
    	return (*p.fg);
    }
    Probleme : Pour respecter la convention d'héritage, je dois passer un const Elem & en paramètre de ma méthode filsGauche. Pour renvoyer le fils gauche, je dois idéalement faire un return(*p.fg). Cependant, p étant un Elem, *fg n'est pas défini et le compilateur ne va pas chercher automatiquement le *fg de ma classe ElemL.

    Est-ce que quelqu'un saurait comment arranger ça?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Comment tu traites le cas où il n'y a pas de fils ?

    Est-ce que quelqu'un saurait comment arranger ça?
    Avec un static_cast<>.

    À part ça tu as oublié les destructeurs virtuels purs.
    Ton compilateur t'a pas donné d'avertissement ?
    Boost ftw

  3. #3
    Membre habitué Avatar de galak63
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Points : 146
    Points
    146
    Par défaut
    Dans Arbre2L, filsGauche doit etre virtuel
    Le plus dur dans la mort, c'est qu'on loupe l'apéro ...
    www.usirugby.rf.lv

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Galak63, pourquoi filsGauche devrait être virtuel dans Arbre2L?

    loufoque, non je n'ai pas reçu d'avertissement concernant les destructeurs virtuels purs.
    Dans le cas, où il n'y a pas de fils il y a un problème (que ne n'avait pas remarqué, merci à toi), car il essayera de déréférencer NULL. Tu as une idée sur la manière de gérer ça? Faire un test avant de renvoyer le fils gauche suffirait?
    Merci pour l'idée du static cast. Je vais essayer de me rappeler comment ça marche. C'est pas gagné...

  5. #5
    Membre habitué Avatar de galak63
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Points : 146
    Points
    146
    Par défaut
    car si dans sa déclaration tu ne le mets pas virtuel, par défaut il va chercher l'implémentation de la classe mère et ca doit etre pour ca que le compilo se marche sur les pieds
    Le plus dur dans la mort, c'est qu'on loupe l'apéro ...
    www.usirugby.rf.lv

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    loufoque, non je n'ai pas reçu d'avertissement concernant les destructeurs virtuels purs.
    Pourtant, quand tu définis une classe avec des fonctions virtuelles, le destructeur devrait toujours être virtuel.
    Ça fait partie des bonnes pratiques de base, qui sont d'ailleurs vérifiées par des compilateurs comme GCC quand tu actives les avertissements.

    Dans le cas, où il n'y a pas de fils il y a un problème (que ne n'avait pas remarqué, merci à toi), car il essayera de déréférencer NULL. Tu as une idée sur la manière de gérer ça?
    Plusieurs, oui.

    Faire un test avant de renvoyer le fils gauche suffirait?
    Bien sûr que non.

    Tu peux tout simplement définir un élément particulier qui est l'élément nul.
    Tu peux aussi renvoyer un pointeur.
    Boost ftw

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    J'ai réussi a enlevé pas mal de problème mais plutôt avec dynamic_cast que static_cast. Je dois encore penser aux destructeurs virtuels mais c'est en cours d'élaboration. Merci beaucoup en tout cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher un arbre binaire avec sa structure
    Par PhoneKilleR dans le forum C
    Réponses: 7
    Dernier message: 23/04/2008, 23h24
  2. suppression d'un arbre binaire
    Par NomUtilisateurDejaPris dans le forum C
    Réponses: 11
    Dernier message: 16/02/2004, 10h05
  3. [Arbre binaire de Recherche]
    Par Giovanny Temgoua dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 06/02/2004, 11h45
  4. Arbre binaire
    Par Heaven dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/02/2004, 19h01
  5. [LG]probleme de creation arbre binaire
    Par jsaviola dans le forum Langage
    Réponses: 2
    Dernier message: 06/01/2004, 20h57

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