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 :

t-uple de taille variable


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut t-uple de taille variable
    Bonjour à tous, j'ai le problème suivant:
    J'ai un classe de Base dont dérivent 4 autres classes (A, B, C et D) et une classe M qui manipule ces 4 classes filles par le biais d'un vecteur de Base*.

    Mon problème est qu'à certains moments, j'ai besoin de connaitre le type des éléments du vecteur pour faire certaines opérations.

    Pour le moment, je m'en suis sorti en utilisant un visiteur mais ce qui m'ennuie c'est que mon vecteur à une structure particulière que je n'exploite pas; en effet un vecteur à la structure suivante : (ABC)^+D qui pourra peut être évoluer vers un (ABC)(BAB)^*D

    Je me demandais donc s'il existait une sorte de t-uple mais à taille variable (je peux avoir des mutations, par exemple, passer de ABCD à ABCABCD dans ma succession d'élément du vecteur) qui me permettrait de me passer du polymorphisme dynamique.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Citation Envoyé par CedricMocquillon Voir le message
    Mon problème est qu'à certains moments, j'ai besoin de connaitre le type des éléments du vecteur pour faire certaines opérations.
    Si tel est le cas, alors le polymorphisme n'est pas adapté, et l'utilisation d'un vecteur de base* n'est peut-être pas une bonne idée, puisque l'intérêt du polymorphisme est justement de pouvoir utiliser ton vecteur de base* sans connaître leur type.

    Si tu dois vraiment connaître le type, tu pourrais rajouter un membre string "nom de la classe", mais ça fait un peu bricoleur du dimanche. Ou alors compléter tes classes pour pouvoir les utiliser sans connaître leur type en rajoutant des méthodes abstraites à ta classe base.

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    #include <typeinfo.h>
    typeid(T)

    Cela conviendrait-il ?

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Peut-être qu'un variant serait plus adapté ? Tu perds par contre l'interface commune, pas sûr que ça soit ce que tu veuilles...

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Au lieu d'avoir A, B, C, et D qui dérivent de Base, fais en sorte d'avoir ABC, BAB et D qui héritent de Base.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Tes classes A, B, C et D ont-elles un état ou seulement un comportement ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut
    @Cheps En fait il y a une petite nuance:
    J'ai besoin d'utiliser le type réel de mes éléments dans ma classe M mais après il y a deux pistes:

    soit je ne connais pas le type de mes élément dans ma classe M et j'utilise le polymorphisme (directement dans la classe de base ou par le biais de visiteur) qui va se charger de le déterminer pour moi (c'est un peu le but du polymorphisme)

    soit j'ai un moyen de connaitre le type de mes éléments dans ma classe M et je me passerai bien d'un appel virtuel + le code qui va bien (soit "alourdir" mes classes avec une responsabilité de plus, soit me défausser sur un visiteur avec une multiplication de classes)


    Or il se trouve que j'ai un moyen de connaitre le type de mes éléments puisque mon vecteur respecte une structure particulière ((ABC)^+D). S'il n'y avait pas de répétition possible de ABC, j'utiliserai un t-uple (c'est pour ça que je parlais de t-uple de taille variable) c'est à ce niveau que j'ai besoin d'aide...

    @camboui: le typeid(T) revient peu ou prou à "rajouter un membre string "nom de la classe", je vais être obligé de faire un switch dessus non?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut
    @white_tentacle: j'ai encore jamais utilisé de variant mais ça à l'air de pouvoir convenir, je perdrai pas l'interface commune puisque dans tout les cas mes classes A, B, C, D hériteront toujours de Base

    @3DArchi: elles ont à la fois un état et des comportements

    @loufoque: j'ai du mal à voir où tu veux en venir et comment utiliser ta réponse

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par CedricMocquillon Voir le message
    @loufoque: j'ai du mal à voir où tu veux en venir et comment utiliser ta réponse
    Je pense qu'il veut dire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class ABC : public base
    {
     A a;
    B b;
    C c;
    };
    class D : public base
    {};
    Et ensuite tu peux faire ton tuple<ABC,D> et ton vecteur dessus. Ou quelque chose de ce genre, j'imagine. En gros, A, B, et C individuellement ne te servent à rien autant te faire directement la classe du ou des motifs qui t'intéressent.

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Citation Envoyé par CedricMocquillon Voir le message
    (ABC)^+D
    ...
    (ABC)(BAB)^*D
    Je pense que j'ai rien compris.
    Que signifie ces écritures ?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut
    C'est pour signifier qu'il y a répétition (+: une fois ou plus; *: 0 fois ou plus) donc par exemple pour (ABC)^+D ça veut dire que mon vecteur de B* est composé de la manière suivante:
    un élément de type A en position 0
    un élément de type B en position 1
    un élément de type C en position 2
    peut être un élément de type A en position 3
    peut être un élément de type B en position 4
    peut être un élément de type C en position 5
    ...
    peut être un élément de type A en position fin-3
    peut être un élément de type B en position fin-2
    peut être un élément de type C en position fin-1
    un élément de type D en position fin

    Je peux donc avoir des séquences de ce type:
    ABCD, ABCABCD, ABCDABCABCD, ...
    mais pas de ABCAD par exemple.
    Je sais pas si c'est plus clair maintenant?

  12. #12
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Oui, OK.
    Mais je ne vois en quoi le polymorphisme dynamique est gênant.
    Et je reviens sur typeid(): c'est prévu par le langage, pourquoi s'en priver si t'en a besoin ?

  13. #13
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Si tout A doit etre suivi d'un B, que tout B doit etre suivi d'un C et que tout C doit être suivi d'un A ou d'un D, mais que tout D est, d'office "final", pourquoi ne pas rajouter une méthode "nextIsAllowed(Base* next) qui te donnerait la réponse sur base d'un dynamic_cast

    Cela te donnerait quelque chose proche de
    Base.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Base
    {
        public:
            virtual bool nextIsAllowed(Base* next) const = 0;
    };
    A.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class B;
    class A : public Base
    {
        public:
            virtual bool nextIsAllowed(Base * next) const
            {
                return (dynamic_cast<B*>(next)!=NULL);
            }
    };
    C.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class A;
    class D
    class C : public Base
    {
        public:
            virtual bool nextIsAllowed(Base * next) const
            {
                return (dynamic_cast<A*>(next)!=NULL||
                        dynamic_cast<D*>(next)!=NULL );
            }
    };
    D.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class D : public Base
    {
        public:
            virtual bool nextIsAllowed(Base *) const
            {
                return false;
            }
    };
    De cette manière, lorsque tu vérifie ton vecteur d'objet, tu peux très facilement vérifier si, oui ou non, les éléments sont dans le bon ordre
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/09/2006, 10h53
  2. [Beamer] Table des matières de taille variable
    Par jacklafrip dans le forum Beamer
    Réponses: 1
    Dernier message: 25/08/2006, 11h44
  3. objet de taille variable en attribut static
    Par BigNic dans le forum C++
    Réponses: 8
    Dernier message: 06/07/2006, 21h41
  4. [TP] Tableau de taille variable
    Par Ripley dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 30/01/2006, 15h36
  5. Comment obtenir un tableau à taille variable ?
    Par marsupilami34 dans le forum Langage
    Réponses: 6
    Dernier message: 27/06/2005, 15h03

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