2013-06-11 2 views
1

포인터 :기능 나는이 같은 몇 가지 일을하려고하고 클래스 멤버

error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.

누군가가 함수 멤버 함수 포인터를 초기화하는 방법을 알고 :

class A { 
    void *(*func)(void *); 

    A(void *(*function)(void *)){ 
     func = function; 
    } 
} 

class B { 
    void *real_func(void *); 
    A ptr; 
    B() 
    :ptr(&real_func) 
    { 
     ... 
    } 
} 

을하지만이 오류가 같은 학급에 ???

감사합니다.

struct B { 
    static void *real_func(void *); 
    A ptr; 
    B() 
    :ptr(&real_func) 
    { 
     ... 
    } 
}; 

정적 멤버 함수는 일반 함수와 같은 역할을, 그래서 당신은 그것을 위해 함수 포인터를 만들 수 있습니다

카를로스

+0

내가 매우가는 독서 http://www.cs.technion.ac.il/users/yechiel/c++-faq/pointers-to-members.html하는 것이 좋습니다 그래서 나는 당신이 대신 것을 사용하는 것이 좋습니다 것입니다 회원 포인터의 내용을 통해 – Cramer

답변

0

이 같은 B를 만들 수 있습니다. 정기적 함수 포인터를 필요로하지 않는 경우

, 당신은 표준 : 기능을 사용할 수 있습니다 : real_func 이후

#include <functional> 

struct A { 
    std::function<void *(void*)> func; 

    A(std::function<void *(void*)> function) 
    : func(function) 
    { 
    } 
}; 

struct B { 
    void *real_func(void *); 
    A ptr; 
    B() 
    : ptr(std::bind(&B::real_func,this,std::placeholders::_1)) 
    { 
    } 
}; 
+0

하지만 내 기능은 정적 일 수 없습니다! 정적 함수 만 초기화 목록에 연결할 수 있습니까? – user2472980

+0

@ user2472980 : 정적 함수 만 일반 함수처럼 작동 할 수 있습니다. –

+0

그래서 ... 비슷한 동작을 얻으려면 어떻게해야합니까? – user2472980

1

정적 멤버 함수 아니라, 그 유형은 void *(*)() 수 없습니다. 대신 void *(B::*)() 그래서 그에 따라 func를 선언 할 필요가있다 : 당신이 조심하는 경우, 당신은 또한 기본 클래스 같이 포인터를 사용할 수 있습니다

void *(B::*func)(); 

// call it like this 
pointer_to_b->*func(); 

,하지만 당신은 확인해야한다는에 대한 포인트에 대한 포인터 B의 인스턴스 :

void *(A::*func)(); 

그러나 대부분의 경우 가상 멤버 함수의 기능 만 복제하고 있습니다.

class A { 
    virtual void *func() = 0; 
}; 

class B { 
    void *func() { 
     // ... 
    } 
}; 
관련 문제