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

Langage C++ Discussion :

Interface et template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 9
    Par défaut Interface et template
    Bonjour,
    Je travaille actuellement sur une application de traitement d'images et je rencontre un petit souci.
    L'architecture se compose en 3 classes: la classe virtuelle IimageManager, et deux classes qui implémentent l'interfaces ImageManager8 et ImageManager16.
    Voici les 3 classes:
    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
    <typename T1>
    class IimageManager{
    int getMax(T1 matrice);
    };
     
     
    class ImageManager8: public IimageManager<QImage>{
    ...
    ImageManager8* ImageManager8::getInstance(){...}
    int ImageManager8::getMax(QImage matrice){...}
    };
     
     
    class ImageManager16: public IimageManager<unsigned short*>{
    ...
    ImageManager16* ImageManager16::getInstance(){...}
    int ImageManager16::getMax(unsigned short* matrice){...}
    };
    Jusque là je n'ai pas de problème de compilation. Le soucis viens dans le main au niveau de l'instanciation.
    J'aurai souhaité faire quelque chose de générique du genre.

    IimageManager* monManager;
    (format==8)?monManager=ImageManager8::getInstance():monManager=ImageManager16::getInstance();

    Cependant lorsque je fais quelque chose de ce type j'ai une erreur de compilation car je dois préciser le type utilisé pour pour IimageManager. Mais au moment ou je déclare l'attribut monManager, je ne connais pas le type que je veux utiliser (QImage ou unsigned short*).
    Du coup je fais appel à votre aide...

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    l'erreur est plutôt explicite.
    T'es-tu déjà venu à l'esprit de faire un std::vector* pVec; ?
    Le compilo t'insultera tout autant. Un template est défini pour un type donné.

    La seule alternative c'est de faire une classe parente qui sert d'interface.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class A { virtual void Do() {} };
    template< class T >
    class B : A {};
     
    A* pA;
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Toi, tu as fait du java, non?

    En C++, une template de classe n'est pas une classe.
    C'est un modèle, que le compilateur utilise pour créer des classes qui se ressemblent.

    en l'occurence, voici comment ton code est traité par le compilateur:
    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
    /*
    template <typename T1>
    class IimageManager{
        int getMax(T1 matrice);
    };
    tiens une template de class nommé IimageManager
    Ok, je note pour plus tard...
    */
     
    /*tiens, je dois traiter ca: class ImageManager8: public IimageManager<QImage>
    ah, mais j'ai pas encore cette instance de IimageManager
    bon, j'ai bien un modèle, allons y:
    */
    class IimageManager<QImage>{
        int getMax(QImage matrice);
    };
     
    /* reprenons... j'en étais où, déjà? */
    class ImageManager8: public IimageManager<QImage>{
    ...
    ImageManager8* ImageManager8::getInstance(){...}
    int ImageManager8::getMax(QImage matrice){...}
    };
     
     
    /* et ca recommence, encore un template que je n'ai pas traité
    bon, j'ai toujours le modèle, allons y:
    */
    class IimageManager<unsigned short*>{
        int getMax(unsigned short* matrice);
    };
     
    class ImageManager16: public IimageManager<unsigned short*>{
    ...
    ImageManager16* ImageManager16::getInstance(){...}
    int ImageManager16::getMax(unsigned short* matrice){...}
    };
    /*
    ouf, j'y suis arrivé
    */
    Ton problème, c'est bien que IimageManager<QImage> et IimageManager<unsigned short*> sont deux classes différentes, et sans lien.
    Il leur faut une classe de base.
    à toi de trouver un dénominateur commun.

    D'après ton problème, c'est que tu essaie de détemplater une classe qui ne devrait pas forcément.

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 9
    Par défaut
    Merci beaucoup pour vos réponses.
    Oui en effet j'ai fais pas mal de java...
    En fait dans mon idée, la classe iImageManager était ma classe modele avec des méthodes virtuelles pures utilisant des types templates.
    Mais du coup comment puis-je créer une classe mère en utilisant des templates.

    Je suis un peu perdu la...

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    template et virtual ne sont pas compatible
    le "truc" qui s'en rapprocherait c'est du CRTP
    mais je pense plutôt que tu essayes de mimer un comportement JAVA, qui est donc mauvais
    en énonçant clairement ton problème nous pourrons t'indiquer comment le résoudre
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Les templates C++ ne sont pas des "génériques" JAVA.

    Compile time VS Runtime

    On vous propose l'héritage : voir le code de Bousk.
    Moi, je propose l'encapsulation dans un autre Singleton.

    Le choix, c'est fonction de la manière dont tu veux te servir de la chose.

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 9
    Par défaut
    Tout d'accord merci pour vos réponses.
    En fait mon problème est d'utiliser le polymorphisme avec des templates mais appartement ce n'est pas possible en utilisant des méthodes virtuelles pures.
    Je ne vois pas trop comment utiliser un singleton. Auriez vous un exemple?

    Merci

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Je ne vois pas trop comment utiliser un singleton. Auriez vous un exemple?

    Le code que vous avez posté en contient déjà 2.
    http://fr.wikipedia.org/wiki/Singlet...de_conception)

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Les classes dérivant d'un même template mais avec des paramètres de template différent ne partage aucun lien de parenté.
    Le plus simple est d'encapsuler ce singleton dans un Singleton à vous qui fera le switch en interne.

Discussions similaires

  1. template, "interface", implementation
    Par line86 dans le forum Langage
    Réponses: 8
    Dernier message: 03/04/2009, 20h52
  2. Moteur de template ou interface personnalisable.
    Par SPKlls dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 27/01/2009, 19h53
  3. [VB6] [Interface] ComboBox à plusieurs colonnes
    Par mtl dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/03/2004, 17h35
  4. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15
  5. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 12h27

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