Недопонимание указателя функции - передача его в качестве аргумента - PullRequest
4 голосов
/ 19 марта 2010

Я хочу передать функцию-член класса A классу B через указатель функции в качестве аргумента. Пожалуйста, сообщите, ведет ли эта дорога куда-нибудь, и помогите мне заполнить выбоину.

#include <iostream>


using namespace std;

class A{
public:

int dosomeA(int x){
    cout<< "doing some A to "<<x <<endl;
    return(0);
}
};

class B{
public:

B(int (*ptr)(int)){ptr(0);};
};

int main()
{
A a;
int (*APtr)(int)=&A::dosomeA;

B b(APtr);
return 0;
}

Этот блестящий кусок кода оставляет меня с ошибкой компилятора:

не может преобразовать int (A::*)(int)' to int (*) (int) 'при инициализации

Во-первых, я хочу, чтобы он компилировался.
Во-вторых, я не хочу, чтобы dosomeA был СТАТИЧЕСКИМ.

Ответы [ 2 ]

6 голосов
/ 19 марта 2010

Указатели на элементы отличаются от обычных указателей функций. Как указывает ошибка компилятора, тип &A::dosomeA на самом деле int (A::*)(int), а не int (*)(int).

Внутри B конструктора вам необходим экземпляр A для вызова члена с использованием одного оператора .* или ->*.

например '

B(int(A::*ptr)(int))
{
    A atmp;
    (atmp.*ptr)(int);
}
3 голосов
/ 19 марта 2010

http://www.parashift.com/c++-faq-lite/pointers-to-members.html

У вас нет указателя на функцию, которая возвращает int и принимает int. У вас есть указатель на функцию-член, которая возвращает int и принимает A * и int. Вам нужно не только установить тип указателя, но и B должен предоставить A *, который будет служить параметром this dosomeA.

Boost :: bind имеет некоторые функциональные возможности, предназначенные для упрощения использования указателей функций в целом, и они обеспечивают поддержку указателей на функции-члены. Смотри здесь .

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