c ++ find () для отображения функции-члена - PullRequest
0 голосов
/ 26 июня 2011

У меня есть два класса с наследованием.Я хочу позволить классам хранить их функции на одной карте.Как я могу создать функцию поиска по ключу?И будет ли работать наследование функции (MyClass_2 не имеет своей собственной функции doSmth (), он должен добавить doSmth () из MyClass)?Моя попытка приведена ниже:Оно работает.Моя проблема в том, что если я вызываю fundAndCallFunc из объекта MyClass_2.Это берет не class1 MyClass_2, но class1 MyClass.Что я должен изменить?

Ответы [ 2 ]

1 голос
/ 26 июня 2011

Как говорит Крис, ваш findFunc должен возвращать фактическую функцию:

MyFunction findFunc(string key)
{
  const map<string, MyFunction>::const_iterator it = functionMap.find(key);
  return it == functionMap.end() ? NULL : it->second;
}

Кроме того, если вы сохраняете только указатель на функцию-член, вы теряете отслеживание реального объекта (так что выможет просто сделать вашу карту статичной!).Возможно, вам также следует сохранить указатель this объекта, то есть сделать карту следующим образом:

std::map<std::string, std::pair<T*, MyFunction> > functionMap;

В addFunc вы бы сказали

functionMap.insert(std::make_pair(funcName, std::make_pair(this, function)));

Использование: Предположим it = functionMap.find("key").Тогда вы могли бы сказать:

MyClass * const p = it->second.first;
MyFunction      f = it->second.second;

p->*f();  // invoke -- yes, it's operator->*() in action
1 голос
/ 26 июня 2011

У вас тут две очевидные проблемы:

  • ваш findFunc метод просто ищет функцию, он ничего с ней не делает (пытается вызвать или возвращает указатель метода), и он объявлен как возвращающий bool вместо MyFunction - не уверен, что ты хочешь, чтобы он делал

  • ваш метод doSmth является закрытым в MyClass, поэтому вы не можете получить к нему доступ в MyClass_2. Вам нужно сделать его защищенным или общедоступным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...