Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++
C++ Forum d'entraide technique sur le langage C++. Avant de poster -> F.A.Q C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 05/01/2013, 18h25   #1
Spown
Invité de passage
 
Homme
Étudiant
Inscription : 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.
Spown est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 10h39   #2
3DArchi
Rédacteur/Modérateur
 
Avatar de 3DArchi
 
Inscription : juin 2008
Messages : 7 631
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 7 631
Points : 12 159
Points : 12 159
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
__________________
Ressources proposées par 3DArchi.
Les fonctions virtuelles en C++.
3DArchi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 12h58   #3
Spown
Invité de passage
 
Homme
Étudiant
Inscription : 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
Bonjour,

Merci pour tout c'est bon tu as trouver le pb ! xD
Spown est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h32.


 
 
 
 
Partenaires

Hébergement Web