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 :

S.O.S : Fonctions membres et classes d�riv�es


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Juin 2007
    Messages
    2
    D�tails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 2
    Par d�faut S.O.S : Fonctions membres et classes d�riv�es
    Bonjour � tous et merci de lire ce message.
    J'ai un gros probleme. Je d�bute en programmation objet et je suis bloqu� sur un probleme de classes d�riv�es.
    Je vais essayer de l'�noncer simplement. Je cherche � faire du code portable (uitlisable a la fois sous linux et windows). J'ai une classe qui doit etre utilisable de mani�re g�n�rique mais les fonctions membres sont impl�ment�es diff�rement sous linux et windows.

    LA CLASSE GENERIQUE
    CAfficheg�n�rique:
    - void afficherconsole ()

    LES CLASSES DERIVEES SPECIALISEES
    CAfficheLinux ::CAfficheg�n�rique
    -void afficherconsole()

    CAfficheWindows::CAfficheg�n�rique
    -void afficherconsole()



    Il n'y a rien dans afficherconsole() de CAfficheg�n�rique, le code �tant d�fini dans les classe d�riv�es.
    Pour que cette fonction membre soit appel�e partout dans mon code de mani�re g�n�rique, je procede comme ca dans le code g�n�rique de mon application:
    Definition de classe puis instantiation en tant que classe d�riv�e:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main (void)
    {
    CAfficheg�n�rique Aff;      //Je la d�finis comme classe g�n�rique
    
    #ifdef LINUX
    Aff = new CAfficheLinux();   //(Pour une l'application sous linux :lol: )
    #elif defined WINDOWS
    Aff = new CAfficheWindows();
    #endif 
    
    
    Aff.afficherconsole();
    return 1;
    }
    Le probleme c'est que comme il n'y a rien de dans afficherconsole() de la classe CAfficheg�n�rique, quand je fais, dans mon code :
    Aff.afficherconsole();
    ca ne marche pas. Est ce que je peux proceder comme ca? Comment faire comprendre que meme si l'instance Aff est de type CAfficheg�n�rique, si je l'instantie comme CAfficheLinux, l'appel � afficherconsole() doit aller chercher le code dans la classe d�riv�e? N'est ce pas une histoire de mot cl� virtual ou un truc dans le genre?
    Merci d'avance pour vos r�ponses, je commence a d�sesp�rer


  2. #2
    Membre �clair�
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par d�faut
    Le probl�me semble simple, tu fais des manipulations interdites. Quand tu fais un new, c'est une adresse qui est retourn�e donc il te faut utiliser un pointeur:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main (void)
    {
    CAffichegénérique *Aff; // 1) On définit un pointeur
     
    #ifdef LINUX
    Aff = new CAfficheLinux(); //(Pour une l'application sous linux  )
    #elif defined WINDOWS
    Aff = new CAfficheWindows();
    #endif
     
     
    Aff->afficherconsole(); // 2) Le point devient une flèche
    return 1;
    }

    De plus, �tant donn� qu'il n'y a pas de code pour la classe g�n�rique, et qu'il n'y aura aucun objet instanci� � partir de cette classe, on peut la mettre en classe abstraite, c'est a dire qu'on d�finit les prototype des classes d�riv�es comme tu l'a fait jusqu'ici. La m�thode afficherconsole() sera alors une m�thode virtuelle pure:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    class CAffichegénérique {
     
       virtual void afficherconsole () = 0; // méthode virtuelle pure
     
    };
    Cela est optionnel mais serait plus logique dans le cas de ton programme et ca interdira l'instanciation de CAfficheg�n�rique.


    EDIT: Erf j'avais oubli� le mot cl� virtual !

  3. #3
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut, et bienvenue sur le forum

    D�j�, pour un affichage console, cout est tout � fait portable win/linux, et l'inclusion de <iostream> ira chercher les fichiers d'entete syst�me

    Autrement, ta classe de base doit etre une classe abstraite, c'est � dire, une classe contenant au minimum une classe virtuelle pure, ce qui prend une forme proche de
    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
     
    class Interface
    {
        public:
            Interface(){}
            virtual ~interface(){}
            virtual void AfficheConsole()=0;/* classe virtuelle pure, qui n'est
                                             * pas implémentée pour Interface */
    };
    Classe MaClasse:public Interface
    {
        public:
            MaClasse():{}
            virtual ~MaClasse(){}
            virtual void AfficheConsole()
            {
              /* la fonction doit etre implémentée, sous peine de voir MaClasse
               * etre aussi abstraite */
            }
    };
    Classe MaClasse2:public Interface
    {
        public:
            MaClasse2():{}
            virtual ~MaClasse2(){}
            virtual void AfficheConsole()
            {
              /* la fonction doit etre implémentée, sous peine de voir MaClasse2
               * etre aussi abstraite */
            }
    };
    Il est � noter qu'une classe abstraite ne peut pas etre impl�ment�e en tant qu'objet du type de la classe abstraite:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    Interface mi();
    /* OU OU OU */
    Interface *mi=new Interface();
    seront tous les deux refus�s par le compilateur, parce que "AfficheConsole est virtuel pure"
    Par contre, un code du genre de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    Interface *i1=new MaClasse(); /* ok, c'est un objet de type MaClasse qui est 
                                   * créé */
    Interface *i2=new MaClasse2(); /* ok, c'est un objet de type MaClasse2 qui
                                    * est  créé */
    i1->AfficheConsole(); /* ok, appelle la méthode AfficheConsole de MaClasse */
    i2->AfficheConsole(); /* ok, appelle la méthode AfficheConsole de MaClasse */
    sera tout � fait valide
    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

  4. #4
    Nouveau candidat au Club
    Inscrit en
    Juin 2007
    Messages
    2
    D�tails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 2
    Par d�faut
    Merci pour vos r�ponses.
    Je vais tenter �a demain matin et si jamais je rencontre un probleme je me rebranche sur developpez.com.

Discussions similaires

  1. R�ponses: 3
    Dernier message: 09/04/2009, 11h30
  2. Savoir utiliser les fonctions membres de class
    Par virtuadrack dans le forum C++
    R�ponses: 12
    Dernier message: 02/02/2009, 13h17
  3. pthread_create et fonction membre de classe
    Par mamelouk dans le forum SL & STL
    R�ponses: 6
    Dernier message: 10/10/2007, 15h47
  4. R�ponses: 4
    Dernier message: 25/01/2007, 21h11
  5. Probl�mes de fonctions membres de classe templates, gcc3.3.6
    Par yves.dessertine dans le forum Autres �diteurs
    R�ponses: 12
    Dernier message: 17/10/2005, 21h36

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