Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2013
    Messages : 2
    Points : 0
    Points
    0

    Par défaut Creation de map sur pointeur sur fonction membre.

    Bonjour,

    Je souhaite creer un gestionnaire d'event pour la SFML.
    J'ai decider de faire ce dernier avec une map ayant pour clef le type d'event et pour valeur un pointeur sur une fonction membre de ce meme objet.
    J'ai essayer beaucoup de "magouille" différentes et celle que je vous joint est celle qui me semble le plus correcte.

    Pouvez vous m'aider svp ?

    EventManager.h:

    Code :
    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
     
    #pragma once
     
    #include				<map>
    #include				<iostream>
    #include				<string>
    #include				"mySFML.h"
     
    class IEventManager
    {
    public:
    	virtual void closeApp(sf::RenderWindow *);
    };
     
    typedef void (IEventManager::*FPTR)(sf::RenderWindow*);
     
    class EventManager: public IEventManager
    {
    private:
    	sf::Event currentEvent;
    	sf::RenderWindow *app;
    	std::map<sf::Event::EventType, FPTR> eventMap;
    public:
    	EventManager(sf::RenderWindow *app);
    	~EventManager(void);
    	void	initEventMap();
    	void	treatEvents();
    	void	closeApp(sf::RenderWindow *);
    };
    EventManager.cpp:

    Code :
    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
     
    #include "EventManager.h"
     
    EventManager::EventManager(sf::RenderWindow *win)
    {
    	app = win;
    	initEventMap();
    }
     
    void    EventManager::closeApp(sf::RenderWindow *app)
    {
    	app->close();
    }
     
    void	EventManager::initEventMap()
    {
    	eventMap[(sf::Event::Closed)] = &IEventManager::closeApp;
    }
     
    void	EventManager::treatEvents()
    {
    	while (app->pollEvent(currentEvent))
    	{
    		if (eventMap[currentEvent.type])
    		{
    			 eventMap[currentEvent.type](this->app);
    		}
    	}
    }
     
    EventManager::~EventManager(void)
    {
    }
    Le sortie de compilation:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    1>------ Début de la génération*: Projet*: ZERO_CHECK, Configuration*: Debug Win32 ------
    2>------ Début de la génération*: Projet*: c_rtype++, Configuration*: Debug Win32 ------
    2>  main.cpp
    2>  EventManager.cpp
    2>..\src\EventManager.cpp(25): error C2064: le terme ne correspond pas à une fonction qui prend 1 arguments
    2>  Génération de code en cours...
    3>------ Début de la génération*: Projet*: ALL_BUILD, Configuration*: Debug Win32 ------
    3>  Build all projects
    4>------ Génération ignorée*: Projet*: INSTALL, Configuration*: Debug Win32 ------
    4>Projet non sélectionné dans le cadre d'une génération pour cette configuration de solution 
    5>------ Génération ignorée*: Projet*: PACKAGE, Configuration*: Debug Win32 ------
    5>Projet non sélectionné dans le cadre d'une génération pour cette configuration de solution 
    ========== Génération*: 2 a réussi, 1 a échoué, 0 mis à jour, 2 a été ignoré ==========
    Voila merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de 3DArchi
    Inscrit en
    juin 2008
    Messages
    7 636
    Détails du profil
    Informations forums :
    Inscription : juin 2008
    Messages : 7 636
    Points : 11 692
    Points
    11 692

    Par défaut

    Salut,
    Le problème, c'est que tu passes un pointeur sur une fonction membre, mais tu ne donnes pas d'objet au moment de l'appel.
    Code :
    1
    2
    IEventManager *anObject;
    (anObject->*eventMap[currentEvent.type])(this->app);
    Tu peux aussi regarder la F.A.Q : pointeur sur fonction membre

    Ceci dit, aujourd'hui, je n'utiliserais pas des pointeurs sur des fonctions membres mais des std::function qui te permettraient de lier un évènement à un objet (bind ou lambda). Tu peux aussi regarder du côté de boost.signal

  3. #3
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2013
    Messages : 2
    Points : 0
    Points
    0

    Par défaut

    Bonjour,

    Merci pour tout c'est bon tu as trouver le pb ! xD

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •