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 :

probléme d'heritage


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut probléme d'heritage
    Bonjour,
    j'ai un probléme d'heritage que je ne comprends pas :
    (jutilise la librairie CMU )
    Voici ma classe de base :


    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
     // objet_graphique.h
     
    #ifndef objet_graphique_h
     
    #define objet_graphique_h
     
    #include "CMUgraphics M.h"
     
     
     
    class objet_graphique
     
    {
     
    public:
     
        objet_graphique(int _x, int _y, window& _pt_fenetre, color _couleur) 
     
            : x(_x),y(_y), pt_fenetre(_pt_fenetre), couleur(_couleur) {}
     
        virtual ~objet_graphique() {} // surchargé dans classes dérivées pour effacer figures
     
     
     
        // deplace un objet p/r à son centre (x,y)  
     
        virtual void deplace(int dx, int dy); 
     
        virtual void affiche() = 0;
     
        virtual void cache() = 0;
     
      int getx() {return x;}
     
      int gety() {return y;}
     
     
     
    protected :
     
        int x,y;
     
        window& pt_fenetre;
     
        color couleur;
     
        void calcul_nouvelles_coordonnees(int dx, int dy);
     
    };
     
     
     
    #endif

    ma classe "herité " :

    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
     
     
     
    #ifndef CERCLE_H
    #define CERCLE_H
     
    #include "objet_graphique.h"
     
     
    class cercle  :public objet_graphique{
    public :
     
        cercle(int x, int y, int z ,window& windows,  color couleur )  ;
        ~cercle();
        void     affiche();
        void    expansion(int indice );
        void    contraction(int indice);
    protected :
        int rayon;
        int centre_X;
        int centre_Y;
     
     
     
     
    };
     
     
     
    #endif
    et voici mon appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cercle* C = new cercle(100,130,50, fenetre, BLUE);
    je précise que je n'ai implémenté aucune methode (); ( l'erreur n'est apparemment pas lié a cela du moins je ne pense pas )

    De plus apparemment l'erreur vient de l'heritage proprement dis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      : error C2512: 'objet_graphique' : no appropriate default constructor available
    : error C2259: 'cercle' : cannot instantiate abstract class due to following members:
            : see declaration of 'cercle'
     
           : see declaration of 'cache' : error C2259: 'cercle' : cannot instantiate abstract class due to following members:
    Merci

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    la première erreur : le constructeur de cercle ne dit pas comment construire l'objet graphique, il faut que ton constructeur ressemble à quelque chose comme ça (pour sa définition)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    cercle::cercle(int x, int y, int z ,window& windows,  color couleur )  : objet_graphique(x, y, windows, couleur) /*suite et fin du constructeur*/
    pour la seconde erreur, tu ne définit pas la méthode cache() qui est virtuelle pure dans object_graphique
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut f
    Bonjour,

    tout d'abord merci pour la rapidité de ta réponse


    Je suis d'accord pour tout ce que tu as dis mais je ne comprend pas pourquoi il faut que je dise comment construire l'objet graphique dans cercle ?
    quand je fais cela l'erreur est reglé;

    Par contre j'ai toujours l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    C2259: 'cercle' : cannot instantiate abstract class due to following members:
            : see declaration of 'cercle'
    Qui correspond a la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     cercle* C = new cercle(100,130,50, fenetre, BLUE);
    Merci

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    l'héritage signifie "est un" c'est à dire, qu'un cercle est un objet_graphique...
    quand tu instancie la classe cercle, tu instancies aussi implicitement un objet_graphique, et il faut bien que la classe cercle sache comment instancier son objet_graphique

    Citation Envoyé par Swoög
    pour la seconde erreur, tu ne définit pas la méthode cache() qui est virtuelle pure dans object_graphique
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut dfg
    Bonjour,

    En effet je n'avais pas compris qu'une fonction virtuelle pure de la classe de base, devait etre obligatoirement defini dans la classe fille!!

    Merci

    tout fonctionne je crois

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par bonjour69
    En effet je n'avais pas compris qu'une fonction virtuelle pure de la classe de base, devait etre obligatoirement defini dans la classe fille!!
    En fait, on n'est obligé de définir toutes les méthodes virtuelles pures seulement quand on veut instancier un objet.
    On peut avoir toute une hiérarchie de classes abstraites avant de définir une classe concrète.
    On ne peut pas faire boire un âne qui n'a pas soif.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut jg
    bonjour,

    je vois mieux le principe d'une fonction virtuelle pure

    Merci

Discussions similaires

  1. Problème d'heritage - toString()
    Par sheriff64 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 05/02/2010, 12h55
  2. Problème d'heritage basique
    Par psal78 dans le forum Général Java
    Réponses: 2
    Dernier message: 03/02/2010, 15h00
  3. [JUnit] [Debutant] Problème d'heritage
    Par Arnaoud dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 02/11/2007, 15h20
  4. problème avec heritage en java
    Par yLaplace dans le forum Langage
    Réponses: 16
    Dernier message: 27/03/2007, 12h31
  5. Problème d'heritage dans vecteur
    Par coco-loco dans le forum Langage
    Réponses: 3
    Dernier message: 07/02/2007, 11h28

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