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 :

aide classe virtuel pure


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 29
    Points : 24
    Points
    24
    Par défaut aide classe virtuel pure
    Bonjour j'ai deux headers que je n'arrive pas a rendre fonctionnelle
    je ne comprend pas comment je doit m'y prendre, un peu d'aide serait la bienvenue
    merci par avance

    Angle.h
    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
    class Angle
    {
      public:
      /// retourne l'angle en degres
      virtual double degrees() = 0;
     
      /// retourne l'angle en radians
      virtual double radians() = 0;
     
      /// retourne le cos de l'angle
      virtual double cos() = 0;
     
      /// retourne le sin de l'angle
      virtual double sin() = 0;
     
    };
    Position.h
    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
    #include "Angle.h"
     
    class Position : public Angle
    {
      public:
      Position(const Angle& lat, const Angle& lon);
     
      ~Position();
     
      Angle getLatitude() const;
     
      Angle getLongitude() const;
     
      double distanceTo(const Position& other) const;
     
      private:
      Angle latitude, longitude;
    };
     
    #endif
    Si j'ai bien compris je ne dois pas faire de angle.cpp vu que angle.h est virtuel pure?
    Comment faire pour que cela compile??
    Je ne souhaite pas de solution toute faite mais plutot une explication sur comment m'y prendre
    merci

  2. #2
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Ta classe Angle est une classe abstraite, c'est à dire qui possède au moins une méthode virtuelle pure (méthode non implémentée dans la classe). Dans ton cas, elle va même plus loin car elle n'implémente aucune de ses méthodes, c'est donc une interface. Or, une classe abstraite (et aussi une interface vu qu'une interface n'est qu'une classe "complètement" abstraite) n'est pas instanciable.

    Ta classe dérivée, Position, doit donc, pour pouvoir être instanciable, implémenter toutes les éthodes virtuelles pures d'Angle.

    Un autre problème dans ta conception: Dans ta classe Position, tu possèdes des objets Angle. Or, Angle n'est pas instanciable. Tu peux au mieux avoir des pointeurs vers des objets Angle (qui seraient issus de polymorphisme).

    Je te conseille également de te poser une question afin d'améliorer ta conception.

    Ta classe Position est-elle un type d'Angle ou possède-t-il un (ou plusieurs) Angles ? On peut rarement être les 2 à la fois, or ta conception laisse penser que tu en aurais l'usage.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Pour commencer, quelques détails qui me chipotent au plus haut point...

    De vocabulaire, d'abord: on parle de fonction virtuelle pure, mais de classe abstaite

    Mettre une relation d'héritage entre un angle et une position me parait pour le moins surprenant:

    En effet, l'héritage (public) représente une relation "Est-un" ("Is-a" en anglais), c'est à dire que l'on peut sémantiquement dire que la classe dérivée est la classe dérivée...

    On peut aussi parler du principe de substitution de liskov (abrégé en anglais sous le vocable LSP) qui veut que, pour pouvoir envisager que B hérite de A, il faut que toute les propriétés qui sont vraies pour un A soient aussi vraies pour un B...

    Tu remarque assez facilement qu'il n'y a aucune propriété d'angle qui soit applicable à une position
    [EDIT]
    On ne peut même pas considérer qu'une position est "implémentée en terme d'angle", car, pour déterminer une position sur une base de triangulation, il faut, au minimum trois angles différents partant de point clairement déterminés...

    Si tu veux pouvoir représenter une position sous la forme d'angles, c'est plutôt une composition qu'il faut envisager sous une forme minimale de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Position
    {
        public:
            Position(Angle const & a1, Angle const & a2, Angle const& a3)
            /*...*/
        private:
            Angle a1;
            Angle a2;
            Angle a3;
     
    }
    (en se basant sur le fait que l'on dispose par ailleurs de la possibilité d'obtenir la position précise à partir de laquelle chaque angle est calculé)
    [/EDIT]
    Pour néanmoins répondre à ta question

    Lorsqu'une fonction est déclarée virtuelle pure (ce qui revient à dire au compilateur: la fonction existe, mais je ne dispose pas des informations qui me permettront de te dire quoi faire), il "manque quelque chose" au compilateur: la définition de la fonction, ce qui rend la classe non instanciable (car le compilateur sait que l'on ne peut pas essayer d'appeler la fonction virtuelle pure)...

    Il faut donc redéfinir toutes les fonctions virtuelles pures dans les classes qui dérivent de la classe abstraite pour être en mesure de créer une instance des classes dérivées

    Toute classe dérivée dans laquelle il restera ne serait-ce qu'une fonction virtuelle pure sera, de facto considérée comme abstraite, et donc, non instanciable
    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

Discussions similaires

  1. Classe virtuelle pure
    Par deubelte dans le forum C++
    Réponses: 31
    Dernier message: 24/10/2011, 10h42
  2. Boost, serialisation et classe virtuelle pure.
    Par AF_2.8 dans le forum Boost
    Réponses: 3
    Dernier message: 06/12/2010, 10h14
  3. question sur les classes virtuelles pures
    Par deubelte dans le forum C++
    Réponses: 5
    Dernier message: 26/07/2010, 16h45
  4. Réponses: 2
    Dernier message: 18/02/2009, 08h29
  5. Réponses: 8
    Dernier message: 16/10/2006, 12h28

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