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 :

Contructeur et Héritage


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 281
    Par défaut Contructeur et Héritage
    Bonjour,

    j'utilise une bibliothèque de moteur 3D nommé Irrlicht.
    Il existe une classe nommée IVideoDriver avec un certains nombre de fonctions. J'aimerais en rajouter une particulière pour mon programme mais sans avoir à modifier le code d'Irrlicht.
    Pour cela je crée une classe MyVideoDriver déclaré de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class MyVideoDriver : public video::IVideoDriver
    Le problème est que normalement pour instancier la classe IVideoDriver il faut procéder de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    video::IVideoDriver* _driver;
    _driver = _device->getVideoDriver();
    Le prototype de la fonction getVideoDriver() est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual video::IVideoDriver* getVideoDriver() = 0;
    Ce que je voudrais faire c'est de pouvoir instancier ma classe via la fonction getVideoDriver, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyVideoDriver* _driver;
    _driver = _device->getVideoDriver();
    Est ce que c'est conceptuellement parlant faisable ? Si oui, commment ? Sinon, je me débrouillerai autrement...

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je ne suis pas sûr d'avoir assez d'infos, mais je pense que tu devrais pouvoir faire une classe dérivée de celle de _device pour retourner un driver vidéo du type que tu veux...

    Ça dépend de ce que doit faire la fonction getVideoDriver() précisément (si c'est une simple création c'est bon, mais s'il faut retourner une instance existant déjà dans la classe, c'est moins sûr...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre expérimenté

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 281
    Par défaut
    Lors de la création de _device un ensemble d'objets sont créés et instanciés.
    La fonction getVideoDriver() renvoi l'instance IVideoDriver qui a été créée dans _device.
    Si je fais une classe dérivé de _device (IDevice), j'aurais toujours le même problème : comment instancier un classe fille à partir d'une instance de classe mère... ?

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par LeGars Voir le message
    Comment instancier un classe fille à partir d'une instance de classe mère... ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Mere
    {
    //...
    };
     
    class Fille : pubilc Mere
    {
    //...
    };
     
    int main()
    {
       Mere* fille = new Fille();
    }
    Dans le code ci-dessus, l'instance fille est bien de type Fille.
    Donc, à moins qu'il y ait des pièges "cachés", et si tu as correctement hérité ta classe fille (implémenté toutes les fonctions virtuelles pure notamment) tu dois pouvoir faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class QIrrDriver : public video::IVideoDriver
    //...
     
    QIrrDriver* driver = _device->getVideoDriver();

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    A priori, je ne pense pas que ce que tu veux faire soit possible ainsi. La factory qu'il te faut utiliser choisi le type d'objet qu'elle crée, et c'est un video::IVideoDriver, pas un QIrrDriver, donc à moins que _device ne fournisse des fonctions pour y enregistrer ta propre classe, c'est foutu.

    Des alternatives (Je ne connais pas Irrlich, donc je ne peux pas choisir pour toi, mais je les mets dans mon ordre de préférence au feeling) :

    - Pourquoi utiliser l'héritage. Faire une simple fonction libre ne suffirait-il pas à résoudre ton problème ?
    - Pourquoi utiliser l'héritage ? Ne pourrait-tu pas faire un wrapper autour de la classe retournée par ta factory ?
    - Si Irrlicht est libre, tu dois pouvoir récupérer le code pour écrire ta propre factory qui créera ton propre objet directement
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre expérimenté

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 281
    Par défaut
    Citation Envoyé par r0d Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Mere
    {
    //...
    };
     
    class Fille : pubilc Mere
    {
    //...
    };
     
    int main()
    {
       Mere* fille = new Fille();
    }
    Dans le code ci-dessus, l'instance fille est bien de type Fille.
    Dans le sens que tu montre, effectivement ça marche. Mais, je me suis peut être mal exprimé, mais moi je voudrais pouvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fille* fille = new Mere();
    Ainsi le contructeur de Fille instancie toute la partie Mere puis sa partie plus spécifique.

    Citation Envoyé par r0d Voir le message
    [code]Donc, à moins qu'il y ait des pièges "cachés", et si tu as correctement hérité ta classe fille (implémenté toutes les fonctions virtuelles pure notamment) tu dois pouvoir faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class QIrrDriver : public video::IVideoDriver
    //...
     
    QIrrDriver* driver = _device->getVideoDriver();
    Je ne comprend pas "les fonctions virtuelles pure". Virtuelle ok, mais pas pure.
    En tous cas je sens que ça va pas me plaire, car IVideoDriver contient vraiment beaucoup de fonctions virtuelles...

    Citation Envoyé par JolyLoic Voir le message
    - Pourquoi utiliser l'héritage. Faire une simple fonction libre ne suffirait-il pas à résoudre ton problème ?
    Je sens que je vais finir comme ça...

    Citation Envoyé par JolyLoic Voir le message
    - Si Irrlicht est libre, tu dois pouvoir récupérer le code pour écrire ta propre factory qui créera ton propre objet directement
    C'est bien libre, mais le code est vraiment trop complexe pour moi :
    Si je veux ajouter des fonctions à la classe IVideoDriver, il faudra les implémenter dans les différentes classes filles de IVideoDriver. Donc, dans ce cas, écrire du code DirectX, OpenGL...

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par LeGars Voir le message
    Dans le sens que tu montre, effectivement ça marche. Mais, je me suis peut être mal exprimé, mais moi je voudrais pouvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fille* fille = new Mere();
    Non non désolé, c'est moi qui avait mal compris

    Citation Envoyé par LeGars Voir le message
    Je ne comprend pas "les fonctions virtuelles pure". Virtuelle ok, mais pas pure.
    Une fonction virtuelle est une fonction qui peut être dérivée, mais qui est implémentée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class UneClasse
    {
       virtual void UneFonctionVirtuelle(){/*du code*/}
    };
    Une fonction virtuelle pure est une fonction virtuelle qui n'est pas implémentée, c'est donc les classe filles qui devront le faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class UneClasse
    {
       virtual void UneFonctionVirtuellePure() = 0;
    };

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    Citation Envoyé par LeGars Voir le message
    Ce que je voudrais faire c'est de pouvoir instancier ma classe via la fonction getVideoDriver, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyVideoDriver* _driver;
    _driver = _device->getVideoDriver();
    Est ce que c'est conceptuellement parlant faisable ? Si oui, commment ? Sinon, je me débrouillerai autrement...
    Bonjour, a priori il faudra implémenter getVideoDriver dans la classe Fille, vu qu'elle est virtuelle pure.
    La classe de base: video::IVideoDriver est sûrement faite pour fonctionner comme un singleton, à verifier. Donc, pareil pour MyVideoDriver.

  9. #9
    Membre expérimenté

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2006
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 281
    Par défaut
    Merci r0d pour ces précisions sur les fonctions virtuelles
    Pour infos donc toutes les fonctions de video::IVideoDriver sont virtuelles pures.

    Finalement le plus simple reste la solution donné par JolyLoic :
    Faire une simple fonction libre.

    Même si je trouve l'utilisation moins pratique, la mise en place est facile étant donné que c'est comme ça que je fonctionnais jusqu'à présent...

    Merci à tous pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Postgresql]Héritage
    Par lheureuxaurelie dans le forum PostgreSQL
    Réponses: 13
    Dernier message: 02/10/2008, 09h18
  2. Réponses: 3
    Dernier message: 31/10/2006, 09h42
  3. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55
  4. [Postgres] Héritage + Clés
    Par k-reen dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/05/2003, 16h37
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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