2013-07-11 3 views
2

Я пытаюсь передать функцию из класса в другой аргумент функции. Я получаю эту ошибку.C++: функция-член как аргумент другой функции

ошибка: аргумент типа 'недействительным (A_t ::) (интермедиат)' не совпадает с 'недействительным (*) (межд)'

Есть ли способ, чтобы справиться с этим, по-прежнему используя функцию внутри класса a. Заранее спасибо.

#include <iostream> 

using namespace std; 

void procces(void func(int x),int y); 

class A_t 
{ 
    public: 
     A_t(); 
     void function(int x) 
     { 
      cout << x << endl; 
     } 
}; 

int main() 
{ 
    A_t a; 

    procces(a.function,10); 
} 

void procces(void func(int x),int y) 
{ 
    func(y); 
    return; 
} 
+7

Правильно, указатели на функции и указатели на функции функций - это одно и то же. – chris

+1

См. Http://www.parashift.com/c++-faq/pointers-to-members.html, что является первым, что появилось, когда я google'd «аргумент функции-члена», «указатель функции-члена» или «член как аргумент другой функции » – kfsone

+1

@kfsone, +1, но никто больше не читает C++ FAQ lite, легче перейти к SO, чем пытаться узнать :-( –

ответ

5

Вот пример того, как можно использовать функцию-член указатель на:

class A_t { 
public: 
    void func(int); 
    void func2(int); 
    void func3(int); 
    void func4(int); 
    ... 
}; 

typedef void (A_t::*fnPtr)(int); 


int process(A_t& o, fnPtr p, int x) 
{ 
    return ((o).*(p))(x); 
} 

int main() 
{ 
    fnPtr p = &A_t::func; 
    A_t a; 
    process(a, p, 1); 
    ... 
} 

В основной функции вы можете использовать функцию func члена, а также func2, func3 или func4.

+0

Спасибо. Это было очень полезно. –

+0

Добро пожаловать! Не забудьте отметить свой вопрос, как было сказано удалите его с неотвеченной страницы :) –

1

Функция() должна быть объявлена ​​как статическая, чтобы это работало. Если вы кладете нестационарную функцию-член в класс, она привязана к конкретному экземпляру класса.

1

и если вы хотите определить API, для которого можно сопоставить функцию C и членом С ++ класса, определить процесс, как показано ниже, и использовать привязку передать функцию-член ....

NB: не тестировалось (I 'm на моем мобильном телефоне!)

class A { 
public: 
    void func(int); 
    static void StaticWrapper(A* ptr, int i) 
    { ptr->func(i);} 
... 
}; 

typedef void (CStyleCB*)(int); 


    int process(CStyleCB p, int x) 
    { 
     return (*p)(x); 
    } 

    int main() 
    { 
     A a; 
     process(bind(&A::StaticWrapper, this, _1), 1); 
     ... 
    }