Определение указателя функции в C ++ не работает - PullRequest
0 голосов
/ 25 ноября 2010

Я не могу решить эту ошибку: КОД:

class myClass
{
  public:
     void callMain() ;
     void (*callme)(int a , int b);

}
void myClass::callMain()
{  
        callSomeApi(callme, <some arguments>);  //callme function pointer is passed as argument
}

void (myClass :: *callme) (int a, int b)            //  it this the correct way to define a function pointer
{

}

Я получаю следующую ошибку в Visual Studio 2008 ошибка C2470: callme выглядит как определение функции, но список параметров отсутствует; пропуск видимого тела`

EDIT : Моя идея: 1. Я хочу создать указатель на функцию-член в классе myClass 2. Определите это вне области. 3. Передайте указатель этой функции в качестве параметра в некоторую функцию Api.

Ответы [ 3 ]

0 голосов
/ 25 ноября 2010

Я думаю, вы пытаетесь сделать что-то подобное, но я могу ошибаться

class MyClass
{
   public:
   typedef void (*funcPtr)(int, int);
   MyClass(funcPtr whatToCall)
   { 
     callme = whatToCall;
   }
   void myClass::callMain()
   {  
       callSomeApi(callme, <some arguments>);  //callme function pointer is passed as argument
   }
private:
   funcPtr callme;
};

void f(int a, int b) {blah blah blah};


int main()
{
   MyClass myObject(f);
   myObject.callMain(); //will call the api function with f passed as argument
}
0 голосов
/ 25 ноября 2010

Трудно сказать, что вы пытаетесь сделать здесь. Вы хотите определить callme как метод, а затем передать указатель на него в качестве первого параметра callSomeApi()? В этом случае просто определите его как простой старый метод и введите callSomeApi(&callme, ...) в callMain(): вам не нужен член-указатель на функцию в вашем классе.

Если вам нужен указатель на функцию в качестве члена по какой-либо причине, тогда ваше объявление в строке 5 является правильным, и вы можете набрать callme = &someFunction, чтобы установить указатель на someFunction(), который должен быть определен где-то остальное.

0 голосов
/ 25 ноября 2010

это так, но почему там тело ?? callme является членом (указателем на функцию).

РЕДАКТИРОВАТЬ Я понятия не имею, почему это понизили.

Нельзя ходить писать

int (*a)(int, int) {
}

потому что int (*a)(int, int); определяет переменную a, которая имеет тип int (*)(int, int).

Если новичок хочет использовать функцию в качестве обратного вызова в callSomeApi, ему нужно сделать

class myClass {
    ....
    void callme(int a, int b);
    ....
}

void myClass::callMain() { callSomeApi(&myClass::callme, this, <etc>); }

void myClass::callme(int a, int b) { ... }

и надеемся, что callSomeApi принимает pmfs или функциональные объекты (и использует bind или аналогичные методы)

РЕДАКТИРОВАТЬ для изменений сошника.

указатель на функцию-член является указателем. это не функция.

Для иллюстрации

int a() { return 1; }

определяет функцию a. Эта функция имеет тип int (). Функция также имеет тело функции.

Однако указатель функции определяется через:

int (*f)();

В этом случае f является указателем на функцию. не имеет тело функции (потому что это не функция).

Можно назначить указатели на функции, например, через =: f = &a; или f = a;, что позволит нам впоследствии сделать f();, что вызовет a.

Но в основном указатель на функцию не имеет тела. Также нет указателей на функции-члены.

...