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 :

[Débutant] Polymorphisme et Fonction propre à la class dérivée.


Sujet :

C++

  1. #1
    Sub
    Sub est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Points : 19
    Points
    19
    Par défaut [Débutant] Polymorphisme et Fonction propre à la class dérivée.
    Bonjour à tous.


    J'aimerais savoir s'il existe un moyen d'appeler une fonction propre à une classe dérivée à partir d'un pointeur sur la classe de base ?

    Soit une classe de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Base
    {
        public :
            Base();
            virtual ~Base() = 0;
    };
     
    Base::~Base()
    {
    }
    La 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
    15
    16
    17
    18
    19
     
    class Derivee1 : public Base
    {
        public :
            Derivee();
            virtual ~Derivee();
            void MaFonctionUniquementPresenteDansDerivee1();
    };
    Derivee::Derivee() :
        Base()
    {
    }
    Derivee::~Derivee()
    {
    }
    void Derivee::MaFonctionUniquementPresenteDansDerivee1()
    {
         // Des trucs
    }
    Et ce que j'aimerais pouvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(void)
    {
        Base* ptrBase = new Derivee1;
        ptrBase.MaFonctionUniquementPresenteDansDerivee1();
    Le problème est qu'en faisant comme cela mon compilateur me dit à juste titre je suppose que la classe base n'as pas de membre : MaFonctionUniquementPresenteDansDerivee1()

    Alors bon je suis un débutant et si vous vous demandez bien pourquoi je veux faire cela et bien c'est très simple(à défaut d'être faisable apparament )

    J'ai une classe ModuleManager qui me permet de faire ce que son nom indique.
    Mais comme j'ai pas envie de me fouler à initialiser chaque module à la main surtout si j'en ai 53, j'aimerais pouvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(int i = 0; i < NOMBRE_DE_MODULE; i++)
    {
        Module[i]->Init();
    }
    Mais j'aimerais également pourvoir faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ModuleManager->Module[Window]->CreateWindow();
    ModuleManager->Module[Entity]->Player->Move();
    etc
    Une solution autre que recoder tout mon moteur ? Pitié ?
    Hein ? Qui a dit "Apprend le C++ avant de coder n'mporte quoi !" ?

  2. #2
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Situ es sûr que Module[Window] va renvoyer un ModuleWindow*, tu le convertir en le bon type avec un static_cast (ou un dynamic_cast si tu veux ajouter en être vraiment sûr).

    Mais j'ai un doute quant à l'efficacité de ta conception. Ca répond vraiment à un besoin, de faire ce genre de choses ?

  3. #3
    Sub
    Sub est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    Tout d'abord merci pour ta réponse rapide.

    Eh bien j'étais partis pour coder un petit moteur de jeu qui devait d'une part être très facile à utiliser, donc pouvoir faire un pong en quelques lignes et d'autres part être particulièrement modulable.Ce qui signifie que si un jour j'avais envie d'utiliser autre chose que SDL pour créer ma fenêtre je n'aurais pas eu besoin de changer la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ModuleManager->Module[Window]->CreateWindow();
    J'aurais juste eu besoin de dériver une nouvelle classe de ma classe CWindow.

    Et cela me paraissait pratique de pouvoir :
    1) Choisir quelle module lancer ou pas
    2) De changer de module juste en choisissant l'ID correspondant dans le tableau Module[].

    Mais bon apparament c'est un peu plus délicat que ce que je pensais. Cela risque de faire un peu gore(t) si je fais un cast à chaque fois.

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Personnellement j'ai l'habitude de développer des moteurs de jeu modulaires, et je n'ai jamais fait face à ce problème.

    Le truc c'est que tu ne devrais pas mettre tous tes modules dans un même panier, c'est vraiment très différent et ne peut pas être amalgammé comme tu le fais.

    Ca donnerait donc plutôt ce genre de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WindowModule->CreateWindow();
    EntityModule->Player->Move();

  5. #5
    Sub
    Sub est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    Ben comme tu l'as dit, cela ne repond pas vraiment à un besoin. Cela me paraissait une bonne idée mais contrairement à toi je n'ai aucune expérience dans la création de jeu donc niveau conception j'expérimente encore (et j'en profite pour appliquer ce que j'apprends dans mes bouquin de C++)

    Si tu as quelques nom de technique/pattern qui permettent une grande modularité, je suis preneur.

    En tout cas merci.

Discussions similaires

  1. Réponses: 10
    Dernier message: 28/08/2008, 19h15
  2. S.O.S : Fonctions membres et classes dérivées
    Par akira44 dans le forum C++
    Réponses: 3
    Dernier message: 26/06/2007, 21h53
  3. Réponses: 3
    Dernier message: 07/03/2007, 12h38
  4. Réponses: 2
    Dernier message: 22/12/2006, 12h35
  5. Réponses: 7
    Dernier message: 02/05/2006, 20h28

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