2017-01-22 20 views
0

Я пишу сцену cocos2dx на C++. Я ищу, чтобы создать набор строковых направлений на основе нажатия кнопок, которые будут выполняться при обновлении сцены. Проблема в том, что мне нужно сопоставить эти строки с методами класса, которые могут быть переопределены подклассами для настройки поведения на основе нажатия кнопки. Я изо всех сил пытаюсь создать карту между строками и указателями на методы класса сцены.Map String to Class Function в C++

Здесь применяется код

В Scene.h

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

В Scene.cpp

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

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

XCode дает мне сообщение об ошибке «Не удается создать непостоянную указатель член функции ".

Когда я пытаюсь сделать указатель на константу метода, он все равно дает ту же ошибку.

В Scene.h

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

Использование '& Scene :: c', чтобы получить адрес функции члена – MRB

+0

, что работает, но как я вызов метода в функции обновления? correlateDirections [string](); ? Говорят, что возвращаемый тип не является функцией или функцией. –

+0

Получите указатель на функцию и вызовите ее следующим образом: '(instance. * FuncPointer) (args)'. И если вы хотите использовать 'this' в качестве экземпляра:' (this -> * funcPointer) (args) '. Возвращаемый тип 'correlateDirections [string]' является итератором. fetch его внутренние данные: '(this -> * (* correlateDirections [string]))()' – MRB

ответ

1

Как это указатель на функцию-член, он не автономен и назвать его вам нужно, и объект класса Scene. Смотрите пример ниже:

#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

карта является членом класса –

 Смежные вопросы

  • Нет связанных вопросов^_^