Почему я не могу получить доступ к указателю на мою функцию-член в моем массиве? - PullRequest
0 голосов
/ 30 января 2020

У меня есть класс с массивом указателей на методы класса. Однако в классе, когда я пытаюсь вызвать одну из функций в массиве, я получаю сообщение об ошибке. Вот соответствующий код:

class MyClass
{
typedef void(MyClass::*FunctionPointer)(size_t *i);
void func1(size_t *i) { }
void func2(size_t *i) { }
void func3(size_t *i) { }
void func4(size_t *i) { }

FunctionPointer myFuncs[4] = { func1, func2, func3, func4 };
const std::string funcList[4] = { "FUNC1", "FUNC2", "FUNC3", "FUNC4" };

void doFunc(std::string in)
{
   size_t *j = 0;
   for (size_t i = 0; i < 4; ++i)
   {
      if (in == funcList[i]) { this->myFuncs[i](j); }           
   }
}
};

Я попытался опустить "this->", а также "this -> *", и ничего не работает. Я получаю сообщение об ошибке: «выражение перед круглыми скобками видимого вызова должно иметь (указатель на) тип функции». Что согласно inte rnet означает, что я пытаюсь вызвать что-то, что не определено как функция. Но я уверен, что я есть? Спасибо

1 Ответ

2 голосов
/ 30 января 2020

Вы можете, если вы будете следовать правильному синтаксису;) Получить адрес метода, используя:

&MyClass::func1

Затем, чтобы разрешить указатель функции, выполните:

(this->*myFuncs[i])

или в полный ...

class MyClass
{
typedef void(MyClass::*FunctionPointer)(size_t *i);
void func1(size_t *i) { }
void func2(size_t *i) { }
void func3(size_t *i) { }
void func4(size_t *i) { }

FunctionPointer myFuncs[4] = { &MyClass::func1, &MyClass::func2, &MyClass::func3, &MyClass::func4 };
const std::string funcList[4] = { "FUNC1", "FUNC2", "FUNC3", "FUNC4" };

void doFunc(std::string in)
{
   size_t *j = 0;
   for (size_t i = 0; i < 4; ++i)
   {
      if (in == funcList[i]) { (this->*myFuncs[i])(j); }           
   }
}
};
...