Определение указателя функции в С++ не работает

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

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
{

}

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

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


person prap19    schedule 25.11.2010    source источник
comment
какая подпись у callSomeApi?   -  person lijie    schedule 25.11.2010
comment
(void(*)(int, int), ‹еще несколько целочисленных параметров.›)   -  person prap19    schedule 25.11.2010
comment
1) myClass синглтон? 2) передаются ли целочисленные параметры в вызове callSomeApi обратному вызову?   -  person lijie    schedule 26.11.2010
comment
мой класс является синглтоном. Я не получил ур 2-й Q??   -  person prap19    schedule 26.11.2010


Ответы (3)


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

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
}
person Armen Tsirunyan    schedule 25.11.2010
comment
не совсем .... я думаю, что мой вопрос очень ясен ... я хочу определить указатель функции как обычный Q и передать имя указателя функции в качестве аргумента функции API ... как это сделать - person prap19; 25.11.2010
comment
@prap19: Нет, на самом деле твой вопрос совсем не ясен. Вы хотите передать функцию-член в качестве параметра функции, которая принимает простой указатель? - person Armen Tsirunyan; 25.11.2010
comment
Я отредактировал вопрос. Думаю, теперь все ясно. Если нет, я уточню больше. - person prap19; 25.11.2010
comment
@ prap19: Я прочитал твою правку. Я все еще не думаю, что вам нужен указатель на функцию-член сам по себе! Вы хотите передать адрес функции-члена функции API, как я понимаю, верно? Если эта функция может быть статической, то это очень просто, я быстро отредактирую свой ответ. Если функция должна быть нестатической, то это немного сложнее. Скажи мне, каким путем ты хочешь пойти? - person Armen Tsirunyan; 25.11.2010
comment
функция API принимает в качестве аргумента void (*)(int, int). - person prap19; 25.11.2010
comment
@prap19: Я знаю это. Мы до сих пор не можем понять друг друга. Вы хотите или не хотите иметь в своем классе функцию-член, которая принимает 2 целых числа, возвращает void и передает эту функцию функции API? - person Armen Tsirunyan; 25.11.2010
comment
@armen: я бы предположил, что да. - person lijie; 25.11.2010
comment
да. но если я не сделаю это как указатель функции-члена, то это даст мне ошибку преобразования, например: не могу преобразовать пустоту (*) (int, int) в (myClass:: callme) (int, int). Пишет, что нет такого преобразования - person prap19; 25.11.2010

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

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

person suszterpatt    schedule 25.11.2010
comment
Функция callAPI принимает параметры, и первый параметр — это указатель на функцию. - person prap19; 25.11.2010
comment
Я понимаю, но действительно ли вам нужно хранить указатель на функцию в вашем классе? Или вы просто хотите передать указатель на один из ваших методов в callSomeApi()? - person suszterpatt; 25.11.2010

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

EDIT я понятия не имею, почему за это проголосовали.

Никто не пишет

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 принимает объекты pmf или функций (и использует bind или аналогичные методы)

EDIT для изменений опенера.

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

Проиллюстрировать,

int a() { return 1; }

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

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

int (*f)();

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

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

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

person lijie    schedule 25.11.2010
comment
Потому что это не так :) Он определяет член типа int (myClass::*)(int,int); - person Šimon Tóth; 25.11.2010
comment
@Let_Me_Be: Что ты имеешь в виду? int (*a)(int, int); определяет обычный указатель на функцию (не указатель на член), независимо от того, является ли a членом класса или нет. Чтобы определить указатель на член, вам все равно нужно будет использовать синтаксис int (myClass::*)(int, int), даже если вы объявляете указатель на член, который также является членом. - person CB Bailey; 25.11.2010
comment
Да, извините, я не должен комментировать, когда работаю над чем-то другим, это всегда плохо заканчивается :-/ - person Šimon Tóth; 25.11.2010