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 :

Classe template mère


Sujet :

Langage C++

  1. #1
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut Classe template mère
    Bonjour !

    Je vais essayer d'exprimer ce que je voudrais, ca va etre dur x)

    Alors, il me faut:
    - une classe template mère, dedans sera défini une fonction 'handle'; et une unordered_map<short, pointeur vers fonction membre de la classe fille>
    - pour tester, on utiliser une seule classe fille, qui va devoir hériter de la class template mere.
    - une classe abstraite(???) qui permettra d'avoir un type de variable commun pour pouvoir utiliser chaque classe fille, mais sur une variable de meme type.

    Voici ce que j'ai,
    La classe mère, et celle abstraite:
    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
     
    #ifndef HANDLER_H
    #define HANDLER_H
     
    #include <unordered_map>
     
    using namespace std;
     
    #include "Packet.h"
     
     
    class PacketHandler {
        public:
        virtual void handle(PacketReader& packet) {};
        static void loadPackets() {};
     
    };
     
    template <class T>
    class Handler : public PacketHandler {
    public:
    	typedef void(T::*handlerf)(PacketReader& packet); // le pointeur vers fonction membre de la classe fille
    	void handle(PacketReader& packet){ // la fonction handle
    		if(handlers.find(packet.GetHeader())== handlers.end()){
    			if(handlers.find(-1)!= handlers.end())
    				((T*)this->*handlers[-1])(packet);
    		}
    		else{
    			handlerf func = handlers[packet.GetHeader()];
    			((T*)this->*func)(packet);
    		}
    	}
    	static void loadPackets(){}; // pour charger les valeurs dans 'handlers'
    protected:
    	static unordered_map<short, handlerf> handlers; // et la map
    };
    template <class T> void Handler<T>::handle(PacketReader& packet);
    #endif
    Voici maintenant, une 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
    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
    41
    42
    43
    44
    45
     
    #ifndef UNKNOWNPACKETHANDLER_H
    #define UNKNOWNPACKETHANDLER_H
     
    #include "../Tools/Handler.h"
     
    using namespace std;
    typedef unsigned short ushort;
     
     
    class Selector;
    class Session;
    class UnknownPacketHandler;
     
     
    class UnknownPacketHandler: public Handler<UnknownPacketHandler>
    {
        private:
            // liste des short a ajouter dans handlers;
     
            static const ushort IDENTIFY        = 0x01;
            Session* target;
            Selector* server;
     
        public:
            /** Default constructor */
            UnknownPacketHandler(Session* t, Selector* st)
            {
                target = t;
                server = st;
            };
            /** Default destructor */
            ~UnknownPacketHandler()
            {
                delete target;
                delete server;
            };
     
            static void loadPackets();
     
            // liste des fonctions a ajotuer dans handlers
            void identify(PacketReader& packet);
    };
     
    #endif // UNKNOWNPACKETHANDLER_H
    Au début de la classe fille j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unordered_map<short, UnknownPacketHandler::handlerf> Handler<UnknownPacketHandler>::handlers;
    Et finalement, un test:
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #ifndef SESSION_H
    #define SESSION_H
     
    #if defined __MINGW32__
    #include <winsock2.h>
    #elif defined __GNUC__
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #endif
    #include <ctime>
    #include <string>
     
     
    #include "Packet.h"
    //#include "Handler.h"
    #include "../PacketHandler/UnknownPacketHandler.h"
    //#include "../PacketHandler/ServerPacketHandler.h"
     
    using namespace std;
     
    typedef string IPaddress;
    typedef int TCPsocket;
     
    class Selector;
    class PacketHandler;
     
    class Session
    {
        public:
            /** Default constructor */
            Session() {}
            Session(const IPaddress& ip, const TCPsocket& sock, Selector* slt)
            {
                SessionInfo.ip = ip;
                SessionInfo.sock = sock;
                SessionInfo.lastping = clock();
                selector = slt;
                handler = new UnknownPacketHandler(this, selector); // et hop, on construit !
            }
            /** Default destructor */
            virtual ~Session()
            {
                delete reader;
                delete selector;
                delete handler;
            }
     
            void handleRequest(const char* Buffer)
            {
                reader = new PacketReader(Buffer);
                handler->handle(*reader);
            }
        private:
     
     
            PacketReader* reader;
            PacketHandler* handler; // ici nous avons le type commun
            Selector* selector;
    };
     
    #endif // SESSION_H

    note: Vous voyez, dans le dernier fichier, j'ai commenté include ServerPacketHandler.
    En effet, le but de ce que j'essaye de faire, et de pouvoir séparer le handler qui s'occupera de la reception de mes packets, car sur mon serveur, je vais avoir des clients, d'autres serveurs, et des robots, et aussi des 'unknown' !
    De plus, elle evite de nombreux if() partout dans le code, car le handler pointra où il faut!

    Voilou !

    Maintenant, retour à la réalité:
    D:\C++\projects\Servers\Master\PacketHandler\UnknownPacketHandler.cpp|3|error: too few template-parameter-lists|
    C'est donc sur la declaration dans le cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unordered_map<short, UnknownPacketHandler::handlerf> Handler<UnknownPacketHandler>::handlers;
    Merci d'avance!
    nico

  2. #2
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Je ne pense pas qu'il y ait d'autre moyen de faire la même chose.

  3. #3
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Possible, mais il y a une petite erreur ^^
    haha

  4. #4
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Ah oui j'avais raté l'erreur.



    Je ne comprends pas du tout la ligne que tu pointes, ce n'est pas du C++ valide. On n'a pas le code en question donc difficile de dire plus.

  5. #5
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Si tu l'as!
    L'erreur est dans UnknownPacketHandler.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "UnknownPacketHandler.h"
     
    unordered_map<short, UnknownPacketHandler::handlerf> Handler<UnknownPacketHandler>::handlers; // ici
     
    void UnknownPacketHandler::loadPackets(){
        handlers[IDENTIFY] = &UnknownPacketHandler::identify;
    }
     
    void UnknownPacketHandler::identify(PacketReader& packet)
    {
     
    }

  6. #6
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Ok j'avais oublié le cas de la variable statique.

    Je ne vois pas clairement d'ou viens le problème mais j'ai une suggestion : fais un typedef publique de ton type unordered_map et utiliser le à la place de celui de la ligne avec l'erreur. Il se peut que ça rende les choses plus clair.


    au passage, ton using namespace std est une invocation satanique quand tu le fais dans un header, mais je vais supposer que tu le sais déjà...

  7. #7
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Oui supposons.
    Bon je vais me coucher, on verra ceci demain.
    merci quand meme!

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il semblerait qu'il faille rajouter un template<> avant le definition de la variable statique.
    Dernière modification par Domi2 ; 01/05/2012 à 09h09. Motif: Lien non pérenne

  9. #9
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Evidemment...

  10. #10
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Apparement, ceci supprime l'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<> unordered_map<short, UnknownPacketHandler::handlerf> Handler<UnknownPacketHandler>::handlers = unordered_map<short, UnknownPacketHandler::handlerf>();
    La compilation: OK.
    Test de la classe: Pas testée encore

    Merci ^^

Discussions similaires

  1. Problèmes de fonctions membres de classe templates, gcc3.3.6
    Par yves.dessertine dans le forum Autres éditeurs
    Réponses: 12
    Dernier message: 17/10/2005, 21h36
  2. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48
  3. [DLL/classe template] problème de link
    Par Bob.Killer dans le forum C++
    Réponses: 7
    Dernier message: 31/08/2005, 18h56
  4. Class template hérité
    Par Azharis dans le forum Langage
    Réponses: 4
    Dernier message: 24/06/2005, 22h03
  5. Réponses: 6
    Dernier message: 06/10/2004, 12h59

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