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 :

[TEMPLATE] deriver une classe template d'une classe de base non-template


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Points : 30
    Points
    30
    Par défaut [TEMPLATE] deriver une classe template d'une classe de base non-template
    Bonjour,

    Je suis dans une situation de ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Base()
    {
    };
     
    template <class type> class MyClass : public Base
    {
    public:
        type value;
    };
    J'ai egalement un vecteur de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Base*> myVector;
    Comment avoir access, le plus simplement, a l'attribut value quand j'accede le vecteur par indexation par ex. myVector[5]


    Merci

  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
    C'est une question assez récurrente.

    Plusieurs réponses :
    - D'un point de vue purement syntaxique, un transtypage est nécessaire (voir dynamic_cast / static_cast dans la FAQ)
    - D'un point de vue un peu plus philosophique, ça relève très souvent d'une erreur de conception. En l'occurence, si tu stockes des Base* c'est que tu veux manipuler des Base*. Si tu veux accéder aux propriétés particulières de chacun de tes objets, il ne faut pas les mettre dans le même panier.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Points : 30
    Points
    30
    Par défaut dynamic_cast / static_cast
    Bonjour,
    Justement, je voulais eviter les dynamic_cast / static_cast.

    J'ai des parametres qui sont de type differents et je voulais obtenir leur valeur a un moment done.

    Le vecteur de la classe de base me convenait parce que je ne peux pas declarer un vecteur non-type et parce que je veux acceder mes parametres par indexation.

    Malheureusement, il semble qu'il n'y a pas de solution facile.

    Merci,

  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
    Il y a un problème dans ta conception. Une fois stocké dans le tableau de Base*, tu ne peux accéder aux données de la classe dérivée que via les fonctions virtuelles ou un transtypage. Or toi tu ne veux ni l'un ni l'autre, j'en déduis que l'utilisation d'un seul conteneur pour stocker tous tes objets n'est pas adaptée.

    L'utilisation d'un conteneur "foutoir" en C++ est généralement une mauvaise idée. Il ne faut jamais mélanger des objets que l'on ne souhaite pas utiliser de la même manière.

  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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par alpidor
    J'ai des parametres qui sont de type differents et je voulais obtenir leur valeur a un moment done.
    Sans même parler de stockage, la question est : Que vas-tu faire des valeurs, qui sont toutes de type différent ? Soit tu leur appliques un traitement uniforme (genre les mettre dans un flux avec <<, qui marche pour tous les types) et tu peux ajouter dans Base une fonction qui fait ce travail, soit tu leur applique un traitement spécifique, et dans ce cas là, il te faudra bien à un moment où à un autre différencier en fonction du type, et donc le faire au moment du dynamic_cast me semble opportun.
    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
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    (Bientôt 10000 messages Laurent. Bravo. A croire que tu n'as pas de vie )

    Pour appuyer ce qu'a dit Laurent, je rajouterais que si tu veux aller dans la direction foutoir, tu dois te débrouiller pour avoir des méthodes virtuelles dans Base et les implémenter dans tes classes dérivées de façon à ce que chacune des classes dérivées agisse comme tu le souhaites. Pourquoi ce n'est pas bon ? Car à priori tu ne dois pas agir en connaissant le type réel de ton Base*. Dans ton cas, c'est pourtant ce que tu veux faire. Et cela va à l'encontre de la notion de polymorphisme. Si tu n'arrives même pas à faire ce que j'ai dit quelques lignes au-dessus, c'est vraiment que ta conception est intégralement à revoir. Cependant, la revoir même si tu arrives à bricoler quelque chose qui marche serait un avantage pour l'évolution de ton code, et probablement pour les performances. L'héritage, ça coute, surtout si tu veux stocker beaucoup de ces objets.

    Comment réorganiser ton code ? Explique nous brièvement le cas concret dans lequel tu as ce problème et nous pourront t'aiguiller, si tu ne trouves pas tout seul.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Points : 30
    Points
    30
    Par défaut ma conception
    Bonjour a tous,

    J'ai une application client (java) serveur(c++) et je dois configurer des objets (e.g. cameras). Les parametres de configuration des objets sont de types differents ex. bool, int etc.

    Supposons que je feux controler le zoom de la camera : j'envoie "15 24" : ce qui veut dire set le 15em parametre (ZOOM) a la valeur 24 : ou bien "14 0" ce qui veut dire mets le ZOOM off

    En c++ j'ai defini les classes mentionnees dans mon premier message :

    classe Base
    {
    Set(std::istringstream is) = 0;
    };

    template <class type> class Param : public Base
    {
    public:
    void Set(std::istringstream is)
    { is >> value; }


    type value;
    }

    et je definis mes parametres:

    .....
    Param<bool> focusOnOf;
    Param<unsigned int> focus;
    Param<bool> zoomOnOf; // 14em parametre
    Param<unsigned int> zoom; // 15em parametre
    Param<std::string> imageSaveFile;
    ...

    Par un moyen quelconque, je complete un vecteur

    std::vector<Base*> paramsVect;

    Ex:
    paramsVect.push_back(&focusOnOf);
    paramsVect.push_back(&focus);
    paramsVect.push_back(&zoomOnOf);
    paramsVect.push_back(&zoom);
    paramsVect.push_back(&imageSaveFile);

    Maintenant, ce qu'il reste a faire est de lire la valeur du type correct stockee dans paramsVect[15] et l'envoyer a la camera

    ex:: set_zoom_value(paramsVect[15]->value);
    set_zoom_on_off(paramsVect[14]->value);

    J'espere que j'ai ete assez explicite

    Merci

  8. #8
    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
    En fait ici il suffirait que tu stockes une référence vers la variable qui doit être mise à jour, ainsi tout le traitement peut s'effectuer à l'intérieur de la classe via la fonction virtuelle Set.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template <class type> class Param : public Base
    {
    public :
     
        Param(type& target) : value(target)
        {}
     
        void Set(std::istringstream is)
        { is >> value; }
     
        type& value;
    }

  9. #9
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Points : 30
    Points
    30
    Par défaut suggestion
    Merci, j'essaye aussitot

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  2. Comment récupérer la classe window d'une application wpf depuis une application ext
    Par rsiwpf dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 14/10/2008, 15h10
  3. Réponses: 5
    Dernier message: 22/05/2008, 14h42
  4. Réponses: 11
    Dernier message: 06/12/2005, 08h23

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