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 :

Template et abstraction


Sujet :

C++

  1. #1
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 548
    Points
    218 548
    Billets dans le blog
    118
    Par défaut Template et abstraction
    Bonjour à tous,

    Je n'arrive pas à m'en sortir dans un cas, avec des templates, que j'aimerai avoir des pointeurs super générique dessus.

    Je m'explique
    Voici mon code :
    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
    template <typename GameBoard>
    class Controler : public Listener<Move<typename GameBoard::Coords> >
    {
        typedef typename GameBoard::Coords Coords;
     
    private:
     
    protected:
        int m_colorControlled;    /*!< Color associated to this controler */
     
    public:
        /*! \brief Default constructor
         *  Will define an invalid color making this controller basically invalid
         */
        Controler():m_colorControlled(-1) {} // Put an invalid color
     
        // virtual ~Controler() = 0;
        /*! \brief Gets the move that the controler wants to play
         *  This function is generally waiting for the move from the controler.
         *  \return
         */
        virtual Move<Coords> getMove() =0;
     
        /*! \brief Defines the color used by the controler
         *  \param color
         */
        virtual void setColorControled(int color)
        {
            m_colorControlled = color;
        }
    };
    J'aimerai pouvoir faire un pointeur de Controler. donc générique au possible. Mais comme ma classe est template, la généricité est stoppée nette une fois un type spécifié (Controler<Type>). Ok, c'est normal.

    La solution en général, c'est de faire une classe abstraite au dessus. Soit, mais en fait, je ne peux pas faire mieux dans ce sens là (j'hérite déjà cette classe).

    Mon problème, c'est que je veux vraiment une fonction virtuelle pure getMove() et que en plus celle-ci me retourne le type Coord qui est sous jacent au plateau.

    Est ce qu'il existe une solution et quelle serait-elle ?

    (Note, le Listener peut être complêtement éjecté, donc ne nous en préoccupons pas)

    En écrivant ce message, j'ai pensé que peut être, le type de retour getMove() et donc la fonction, ne devra être spécifié que dans les classe héritante, mais je souhaite vraiment avoir la fonction en virtuelle pure.
    Sinon, peut être passer la fonction en fonction template (donc, que le template soit spécifier à l'appel et non à la création de la classe). Je suis pas sur que cela puisse marcher et surtout que le compilateur ne m'enguirlande pas à faire des fonction templates virtuelle pure (je vais tester)
    EDIT : Bah oui, un template ne peut pas être virtuel ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonjour,

    La description du problème technique me laisse à penser que tu n'as peut-être pas définie assez clairement les points de variation de ton design en particulier le moment de leur détermination (compilation/exécution pour ton cas).

    Pourquoi as-tu besoin d'un pointeur sur un Controler<T> dont tu ne connais pas le T ? Dit autrement quand est déterminé le GameBoard utilisé ?

    Sinon de manière plus générique la solution typique est un Variant couplé à un Visitor. Cependant ta volonté de connaitre le Coords pour le type de retour va être un problème.

    NB: Non, fonction template virtuelle ça n'existe pas.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 548
    Points
    218 548
    Billets dans le blog
    118
    Par défaut
    En fait, les controleurs ne sont utilisé que dans une classe Game. Cette classe, je veux aussi la rendre abstraite (AbstractGame), qui aura une fonction addControler et le controler devra donc être un pointeur.

    Le but d'avoir un abstract game était de faire un jeu qui, après la demande de l'utilisateur, soit un jeu d'échec, ou un jeu de dame, ou un jeu autre

    Donc, oui, à un moment j'ai un conflit dans le fait de savoir si c'est compilation-time ou execution-time. Mais en même temps, je me dis que cela pourrait fonctionner
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Tu codes pour faire un programme ou une bibliothèque ? "l'utilisateur" c'est l'utilisateur final ou l'utilisateur de ta bibliothèque ?

    Faire un passage détermination compile time / détermination runtime, ca se fait (typiquement via une factory sur un type variant). Cependant devoir en abuser est un signe d'un problème dans les choix du design.

    Est-ce que le type Gameboard est connue au sein d'un classe concrète GameA ? Si non, où/quand/par qui est déterminé ce type ?

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 548
    Points
    218 548
    Billets dans le blog
    118
    Par défaut
    Utilisateur finale (le joueur).
    J'avais décidé de faire une fabrique, qui fabriquerai les game, afin de les ressortir en AbstractGame et de les utiliser. Mais à cause de ce controler qui est finalement dépendant du plateau (quoi que ... je dis peut être une bétise).
    J'essaie d'éviter les abus et le coup du variant ne me semble pas du tout une solution cette fois.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonsoir,

    et si tu passais en paramètre template une classe implémentant le comportement de getMove (classe de politique), est-ce que cela solutionnerait ton problème? Cela ne correspond pas tout à fait à la virtualité pure mais peut-être que cela suffit dans ton cas?

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 548
    Points
    218 548
    Billets dans le blog
    118
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Bonsoir,

    et si tu passais en paramètre template une classe implémentant le comportement de getMove (classe de politique), est-ce que cela solutionnerait ton problème? Cela ne correspond pas tout à fait à la virtualité pure mais peut-être que cela suffit dans ton cas?
    Je dois dire que j'ai du mal à imaginer cette solution. Pouvez vous me donner un exemple, ou même détaillé l'explication, s'il vous plait ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    tu trouveras un exemple ici.

    Dans cet exemple, on fait varier le comportement de Accumulation en lui passant en paramètre une Operation devant nécessairement avoir pour fonction membre une fonction statique Accumuler (on n'est pas forcé de la prendre statique). Ensuite, il suffit de définir les opérations que l'on veut (Addition, Multiplication, ...).

    De façon similaire, tu pourrais passer en paramètre template une classe Move, ayant pour fonction membre une fonction getMove.

Discussions similaires

  1. Abstraction, Template & operateur
    Par ikeas dans le forum Langage
    Réponses: 7
    Dernier message: 30/12/2014, 13h04
  2. appliquer plusieurs templates
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 04/04/2003, 16h26
  3. template match="node() mais pas text()"
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 26/03/2003, 10h52
  4. [XSLT] template
    Par demo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/09/2002, 11h31
  5. Abstract VS virtual
    Par LE CHAKAL dans le forum Langage
    Réponses: 2
    Dernier message: 29/08/2002, 17h50

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