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 :

[Héritage] Hériter d'une bibliothèque


Sujet :

C++

  1. #1
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut [Héritage] Hériter d'une bibliothèque
    Bonjour à tous,

    Je travaille actuellement avec la bibliothèque de traitement d'images CImg. Je la trouve très bien et très complète. Cependant, j'aimerai rajouter des fonctions que je code moi-même...
    Je pourrai coder directement dans la librairie (sous forme d'un .h) les nouvelles fonctions membres de mon propre cru, mais en cas de mise à jour de la bibliothèque, celà pose évidemment problème.

    La solution logique est donc l'héritage. Mais j'ai une question importante à vous poser: comment créer une classe qui "renverrai" tout vers la classe mère?
    Suis-je obliger de redéfinir tous les constructeurs dans ma nouvelle classe fille?

    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
    #pragma once
     
    #include <iostream>
    #include <string>
     
    #include "CImg.h"
     
    template <typename T>
    class Image : public cimg_library::CImg<T>
    {
    public:
    	Image(); //Constructeur par défaut
    	Image(std::string nom_image); // Autre constructeur
    	~Image();
    };
    Merci à vous !

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    C'est là où on voit que le modèle du "tout méthode" a de très grandes limites dans ces cas.
    Désolé, je ne crois pas qu'il y ait de méthode simple pour corriger ce souci.
    C'est vraiment *** quand on sait qu'on peut simplement décider de mettre tout en fonction libre qui sera ensuite capable de gérer n'importe quel type d'image...

  3. #3
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Citation Envoyé par poukill
    Suis-je obliger de redéfinir tous les constructeurs dans ma nouvelle classe fille?
    Pour le constructeur par défaut, ce n'est pas nécessaire (C++ en rajoutera un tout seul). Pour les autres constructeurs oui (mais il y en a tant que ça ?).

    Citation Envoyé par poukill
    comment créer une classe qui "renverrai" tout vers la classe mère?
    Là je comprends pas ! ... Tu parles toujours des constructeurs ou des autres méthodes ?

    Si c'est des autres méthodes dont tu parles, je ne vois pas le problème puisque si ta classe fille hérite, elle reprend complètement l'ensemble des méthodes de la classe mère sans rien avoir à écrire de plus ?!? ....

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Merci Miles pour ton avis.

    Ce que je cherche à faire, c'est rajouter des fonctions membres dans la classe cimg_library::CImg<T> de la bibliothèque CImg...
    Je voulais partir sur de l'héritage pour y arriver, en créant donc ma propre classe Image...
    Cette classe Image n'a pas besoin d'attributs, mais seulement de nouvelles méthodes implémentées par mes soins.

    Je n'ai pas besoin de réimplémenter les méthodes de la classe mère (bien évidemment), mais par contre il va falloir définir tous les constructeurs (au moins une dizaine)... Ca prendra pas tant de temps que ça, mais je cherchais la solution la plus "élégante" pour rajouter des fonctions à cette librairie!

    Si vous avez d'autres idées, qui pourraient faire que ça marche mieux, ou différemment, ça serait cool merci...

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Sérieusement, la seule manière propre de réaliser ce genre de choses, ce sont des fonctions libres.
    CImg est apparu dans le labo lors de notre recherche de nouvelle solution pour le traitement d'images, elle est vite partie, entre autres pour cette raison, une architecture trop fragile.

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Qu'utilises tu alors comme librairie Miles?

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    On utilise Vigra maintenant.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Par défaut
    si tu veux quand meme hériter de tous les contructeurs, tu dois pouvoir faire un truc dans le genre (pour tous les constructeurs a 1 ou 2 paramètres) :

    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
     
     
    class PipoTest1
    {
     
    public:
     
    	PipoTest1(int _iA)
    	{
    	}
     
    	PipoTest1(float _fA)
    	{
    	}
     
    	PipoTest1(const string &_sA)
    	{
    	}
     
    };
     
    class PipoTest2 : public PipoTest1
    {
     
    public:
     
    	template <class P1> PipoTest2(const P1 &_1):PipoTest1(_1) {}
    	template <class P1,class P2> PipoTest2(const P1 &_1,const P2 &_2):PipoTest1(_1,_2) {}
     
    };
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	PipoTest2 kPipo1(1);
    	PipoTest2 kPipo2(1.0f);
    	PipoTest2 kPipo3("pipo");
    }

  9. #9
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Je l'utilise aussi en parallèle pour tout ce qui est labellisation de zones, etc... Mais l'atout indéniable de CImg est le display des images, simple et efficace.
    La partie affichage n'est pas le plus facile en C++, alors...

    Juste deux questions Miles:
    1) Comment gères-tu l'affichage? (pour ma culture personnelle)
    2) Le problème d'héritage sera le même avec Vigra : pour rajouter des fonctions "membres" ça na marchera guère non? Reste que des "fonctions libres"?

    Merci à toi.

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    1) N'existe pas dans Vigra
    2) aucune méthode à rajouter, tout doit être des fonctions libres - je pensais que ça serait évident vu ce que j'ai indiqué avant -

  11. #11
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Miles
    1) N'existe pas dans Vigra
    2) aucune méthode à rajouter, tout doit être des fonctions libres - je pensais que ça serait évident vu ce que j'ai indiqué avant -
    C'était évident, mais bon je préférai m'en assurer, la structure de Vigra étant très différente. Je pense toujours avoir besoin de fonctions annexes, et les fonctions libres ne sont pas vraiment une solution élégante dans le code.

    Je sais bien qu'il n'existe rien dans Vigra pour l'affichage. Je voulais savoir ce que tu utilisais pour l'affichage graphique!
    Je me penche actuellement sur WxWidget.

    Merci.

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par poukill
    Je pense toujours avoir besoin de fonctions annexes, et les fonctions libres ne sont pas vraiment une solution élégante dans le code.
    Pas uen solution élégante ?? Tu rigoles ? C'est sans doute la solution la plus élégante dans 99% des cas.
    Citation Envoyé par poukill
    Je sais bien qu'il n'existe rien dans Vigra pour l'affichage. Je voulais savoir ce que tu utilisais pour l'affichage graphique!
    Je me penche actuellement sur WxWidget.
    Je ne m'occupe pas d'affichage, on a un ingé pour ça. Et comme c'est de l'image 3D, ça n'a plus rien à voir.

  13. #13
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Miles
    Pas uen solution élégante ?? Tu rigoles ? C'est sans doute la solution la plus élégante dans 99% des cas.

    Je ne m'occupe pas d'affichage, on a un ingé pour ça. Et comme c'est de l'image 3D, ça n'a plus rien à voir.
    Ok d'accord
    Merci pour l'info. Je n'ai malheureusement personne à qui déléguer mon travail...

  14. #14
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 2
    Par défaut Utilise les 'plugins' de CImg
    Il y a un mécanisme exprès pour ajouter tes fonctions directement dans la classe CImg, sans avoir d'héritages à faire : les plug-ins.

    "cimg_plugin : This variable tells the library to use a plugin file to add features to the CImg<T> class. Define it with the path of your plugin file, if you want to add member functions to the CImg<T> class, without having to modify directly the "CImg.h" file. An include of the plugin file is performed in the CImg<T> class. If cimg_plugin if not specified (default), no include is done."

    Tu peux regarder, il y a des exemples qui montrent comment faire. Efficace et simple.

  15. #15
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Oh, Merci David!
    Je vais y jeter un coup d'oeil !

    J'utilise maintenant WxWidget pour l'affichage et interface graphique.
    Pour éviter me modifier tous mes programmes, j'avais surchargé les opérateurs << (du std::cout) et la méthode display (vers une fenetre Widget maintenant).

    Je peux faire la même chose avec un plugin ?

  16. #16
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ce hack est bien la preuve d'une erreur de conception bien dommageable

  17. #17
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 2
    Par défaut
    Oui tu peux tout à faire, les plug-ins permettent de personnaliser la bibliothèque comme tu le souhaites :
    Tu mets ta fonction dans un fichier 'plugin.h', par exemple :

    //--- file plug-in.h
    int f(const CImg<T>& a) {
    return a.size();
    }

    (mais ca marche aussi avec un operator<<() par exemple)

    puis tu définis simplement :

    #define cimg_plugin "plug-in.h"
    #include "CImg.h"

    et maintenant, la fonction f() est une méthode de CImg<T>, que tu peux appeler dans ton programme.

    David.

  18. #18
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Ok merci David pour ces précisions...

    Si j'ai un souci plus grave, j'irai sur le forum CImg...

    A+

  19. #19
    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
    Citation Envoyé par mchk0123
    Pour le constructeur par défaut, ce n'est pas nécessaire (C++ en rajoutera un tout seul).
    A partir du moment où un constructeur est défini, le compilateur n'a plus le droit d'en ajouter un par défaut.
    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.

  20. #20
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Oui effectivement, il ne rajoute plus de constructeur par défaut dans ce cas là.

    C'est assez bizarre d'ailleurs ; je ne comprends pas ce qui l'empêcherai de le faire ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/05/2006, 19h04
  2. Installation d'une bibliothèque
    Par Empty_body dans le forum JBuilder
    Réponses: 3
    Dernier message: 09/02/2006, 19h43
  3. Utiliser une bibliothèque statique
    Par djflex68 dans le forum MFC
    Réponses: 6
    Dernier message: 15/08/2005, 19h26
  4. Réponses: 7
    Dernier message: 25/03/2005, 14h05
  5. Réponses: 19
    Dernier message: 26/04/2004, 08h54

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