2016-06-24 7 views
1

Я пытаюсь передать функцию-член в качестве аргумента, используя pointer-to-member-function. Я уже видел некоторые ссылки вроде этого here, но я не мог решить проблему.Передача функции-члена в качестве аргументов с использованием функции-указателя на C++

Класс Foo имеет две функции-члены. Мне нужно передать функцию addition в качестве аргумента функции NewOper. Это мой код. Я могу правильно использовать указатель для вызова функции addition, но он дает мне ошибку, когда я пытаюсь передать ее в качестве аргумента функции NewOper. Я ценю это, если вы скажете мне, как я могу это исправить. (Последние две строки вызывают ошибку)

#include <iostream> 
using namespace std; 
class Foo{ 
public: 
    int addition(int a, int b) 
    { 
     return (a + b); 
    } 

    int NewOper(int x, int y, int(*fnc2call)(int, int)) 
    { 
     int r; 
     r = (*fnc2call)(x, y); 
     return (r); 
    } 
}; 
int main() 
{ 
    int m,n, k, l; 
    int (Foo::*fptr) (int, int) = &Foo::addition; 
    Foo obj; 
    m=(obj.*fptr)(1,2); 
    Foo* p = &obj; 
    n=(p->*fptr)(3,4); 
    cout << m << endl; 
    cout << n << endl; 
    //********************** 
    int (Foo::*fptr) (int, int, int(*fnc2call)) = &Foo::NewOper; 
    k = (obj.*fptr)(1, 2, addition); 
} 
+0

Это выглядит очень похоже: http://stackoverflow.com/questions/130322/how-do-you-pass-a-member-function-pointer Я не Конечно, это дубликат. –

+0

'Foo :: addition' должно быть' static' для передачи в 'NewOper'. – Jarod42

+0

На какой вопрос ваш вопрос? Почему вы прокомментировали последние 2 строки? – Barmar

ответ

1

У вас уже есть ответ на свой собственный код:

int (Foo::*fptr) (int, int) = &Foo::addition - здесь вы правильно объявлены fptr как указатель на функцию, которая (не статический) член класса Foo

Но вы забыли сделать то же самое в вас NewOper определение функции:

int NewOper(int x, int y, int(*fnc2call)(int, int)) - эта функция хочет адрес бесплатно функция как третий аргумент. Переопределите его так же, как вы заявили fptr. Но тогда вам нужно будет также передать указатель на объект класса Foo на эту функцию.

В качестве альтернативы вы можете сделать свою функцию addition функцией static, поскольку предложенный Jarod42 (на самом деле, как это написано сейчас, нет причин для того, чтобы он был членом класса Foo, если вы еще не планируете его). Затем вам нужно будет удалить Foo:: от fptr определение