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 :

polymorphisme encore dsl


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut polymorphisme encore dsl
    Bonjour,
    J'appelle dans operator+ une fonction add qui sera défini dans chacun des class héritant de Space.
    Voir le code
    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
     
    class Space
    {
    public:
      Space & operator +=(const Space x);
      virtual inline void add(const  Space *x) ;
    };
    Space & Space::operator +=(const Space x)
    {
      this->add(&x);
    }
    class Space1d:public Space
    {
    public:
      int i;
      Space1d():i(0){}
      Space1d(int j):i(j) {}
      inline void add( const Space* x)
        {
          this->i = x->i;
        }
    };
    Le problème à la compilation est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    «const class Space» has no member named «i»
    i.e. pour le compilateur l'argument x de add est un oblet de la classe mère Space donc qui n'a pas d'instance int i. Ce que je voudrais savoir c'est comment résoudre ce problème???

    Merci,
    PS: Je remercie les habitués de ce site pour le sujet d'avant

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Pour résoudre le problème, je surchage l'opérateur.
    Merci
    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
     
    class Space
    {
    public:
      friend std::ostream& operator << (std::ostream& O, const Space& B);
       Space & operator +=(const Space x);
     
      virtual void Print(std::ostream& O) const
        {
          cout << "toto";
        }
    };
     
    Space & Space::operator +=(const Space x)
    {
      return *this;
    }
    std::ostream& operator << (std::ostream& O, const Space& B)
    {
        B.Print(O);
        return O;
    }
     
    class Space2d:public Space
    {
    public:
      int i[2];
      Space2d()
        {i[0]=0;i[1]=0;}
      Space2d(int i0,int i1){i[0]=i0;i[1]=i1;}
     
       void Print(std::ostream& O) const
        {
         cout << i[0]<<"  "<<i[1]<<endl;
        }
      Space2d & operator +=(const Space2d x)
        {
          i[0]+=x.i[0];
          i[1]+=x.i[1];
        }
    };
    Ca commence à être bien le C++ par rapport à ma religion d'antan le C pure.

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    En déclarant la variable i comme membre de ta classe Space (public ou protected mais pas private) ...

    Ensuite déclarer un fonction virtual inline ne sert a rien, ta fonction ne sera pas inlinée puisque le virtual indique justement que la fonction peut être redéfinie dans les classes déribvées et qu'il faut donc vérifier ça à l'exécution, lors de l'appel de la fonction, alors que l'inline indique au compilo de remplacer l'appel de la fonction par lae corps de la fonction lors de la compilation.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Big 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
     
    int main()
    {
    Space2d s1,s2(2,3);
      Space *s;
     
     
      s1+=s2;
      cout << s1;
     
      s = &s1;
     
      *s+=s2;
      cout << *s;
    }
    Affichage
    Il a fait l'addition définie pour la class mère Space or j'aurai voulu qu'il fasse celle de Space2d.....

    De plus s2=*s;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    _rm.cpp:109: erreur: no match for «operator=» in «s2 = * s»
    _rm.cpp:60: note: candidats sont: Space2d& Space2d::operator=(const Space2d&)
    A l'aide!!!!!!!

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Citation Envoyé par bolhrak
    Ensuite déclarer un fonction virtual inline ne sert a rien
    La plupart des compilos supportent ce type de déclaration. Ils garantissent le polymorphisme mais sont capable 'd'inliner' quand le type ne fait pas de doute.
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Foo { 
    public:
        virtual int bar() { return val_; } 
    private:
      val_;
    }; 
    int main()
    {
      Foo foo;  // Création sur la pile, pas de polymorphisme possible
      int x = foo.bar(); // Pas de liaison dynamique --> inline
    }

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Effectivement je n'avais pas pensé à ce cas là ! Généralement quand j'ai une hiérarchie de classe c'est justement pour exploiter le polymorphisme et je déclare donc mes variables sur le tas

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ce que tu cherches à faire c'est du double-dispatch, càd que la liaison dynamique ne dépend non plus du type d'une instance, mais de deux. Et là les mécanismes de fonctions virtuelles ne sont plus suffisant.

    Fais quelques recherches sur le sujet.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    j'essaye mais je n'y arrive pas...

    snif snif

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    vraiement personne...

Discussions similaires

  1. Programmer encore en VB 6 c'est pas bien ? Pourquoi ?
    Par Nektanebos dans le forum Débats sur le développement - Le Best Of
    Réponses: 85
    Dernier message: 10/03/2009, 14h43
  2. choix sgbdr (encore!)
    Par _Gabriel_ dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 23/03/2004, 10h39
  3. TEdit (encore)
    Par dj.motte dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/12/2002, 19h02
  4. TPalette (encore)
    Par Flipper dans le forum Langage
    Réponses: 3
    Dernier message: 28/11/2002, 23h45

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