2017-01-22 1 views
0

J'écris une scène cocos2dx en C++. Je cherche à créer un ensemble de directions de corde basé sur des appuis de bouton qui seront exécutés quand je met à jour la scène. Le problème est que j'ai besoin de corréler ces chaînes à des méthodes de la classe qui peuvent être remplacées par des sous-classes pour personnaliser le comportement en fonction du bouton. J'ai du mal à créer une carte entre la chaîne et les pointeurs vers les méthodes de classe de scène.Mapper une chaîne à une fonction de classe en C++

Voici le code applicable

Dans Scene.h

std::map<std::string, void (Scene::*)()> correlateDirections; 

Dans Scene.cpp

correlateDirections["c"] = &this->c 

void Scene::c() { 
    std::cout << "c" << std::endl; 
} 

XCode me donne l'erreur « Impossible de créer un pointeur non constant fonction de membre. "

Lorsque j'essaie de rendre le pointeur sur la méthode constante, la même erreur se produit toujours.

Dans Scene.h

std::map<std::string, void const (Scene::*)()> correlateDirections; 
+0

Utiliser '& Scène :: c' pour obtenir l'adresse de la fonction membre – MRB

+0

qui fonctionne, mais comment puis-je appeler la méthode dans la fonction de mise à jour? correlateDirections [chaîne](); ? Il est dit que le type retourné n'est pas une fonction ou un pointeur de fonction –

+0

Obtenez votre pointeur de fonction et appelez-le de cette façon: '(instance. * FuncPointer) (args)'. Et si vous voulez utiliser 'this' comme instance:' (this -> * funcPointer) (args) '. Le type de retour de 'correlateDirections [chaîne]' est un itérateur. récupère ses données internes: '(this -> * (* correlateDirections [string]))()' – MRB

Répondre

1

Comme il est un pointeur vers une fonction membre, ce n'est pas autonome et l'appeler vous avez besoin et objet de scène de classe. Voir exemple ci-dessous:

#include <map> 
#include <string> 
#include <iostream> 

class Scene 
{ 
public: 
    void runMe() { std::cout << "runMe" << std::endl; } 
}; 

int main() 
{ 
    std::map<std::string, void (Scene::*)()> sfMap; 
    Scene scene; 
    sfMap["runMe"] = &Scene::runMe; 

    // call via reference to object 
    (scene.*sfMap["runMe"])(); 

    // call via pointer to object 
    Scene* p = &scene; 
    (p->*sfMap["runMe"])();  

    return 0; 
} 
+0

la map est un membre de la classe –