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