#c #pointers #function-pointers
Вопрос:
Я пытаюсь понять, как использовать неупорядоченную карту для вызова методов класса, но когда я это делаю, в ней говорится: «выражение, предшествующее скобке явного вызова, должно иметь тип функции (указатель на)». Почему это происходит и что я могу сделать, чтобы заставить это работать?
#include lt;iostreamgt; #include lt;unordered_mapgt; class Calculator { public: void add(intamp; n) { n; } void sub(intamp; n) { --n; } }; int main(int argc, char** args) { std::unordered_maplt;char, void(Calculator::*)(intamp;)gt; umap; umap[0] = Calculator::add; umap[1] = Calculator::sub; int x; x = 10; umap[0](x); return 0; }
Комментарии:
1. Есть ли какая-либо причина, по которой вам нужны указатели на функции-члены? Функции не зависят от внутреннего состояния
Calculator
класса, они могут быть свободными (илиstatic
членскими) функциями.2. Я чувствовал, что было бы проще и чище, если бы они были в классе, разве это не то, что вы можете сделать?
3. Вам нужен объект этого класса для вызова функции. Что-то вроде
Calculator c; (c.*(umap[0]))[x]
.4. Функции-члены и функции, не являющиеся членами (например, статические или в области пространства имен), очень разные. Как написано, обе ваши
add
sub
функции и нуждаются вCalculator
экземпляре для их вызова, что влияет на синтаксис и то, как вы их на самом деле вызываете. Это действительно то, чего ты хочешь?