2013-12-16 6 views
3

구조체를 함수 포인터로 초기화하려고하지만 전역 함수로 완료하지 않으면 문제가 발생합니다. 다음 코드는 작동 : 나는 코드가 더 이상 작동 MyClass의 함수로 tester 기능이 작업을 수행하려고 할 때마다C++ : 구조체 및 설정 함수 포인터 초기화

float tester(float v){ 
    return 2.0f*v; 
} 

struct MyClass::Example{ 
    typedef float(*MyFunc)(float); 

    MyFunc NameOfFunc; 

    float DoSomething(float a){ 
     return NameOfFunc(a); 
    } 
}; 

struct Example e; 
e.MyFunc = tester; 

내 문제입니다. 즉, 테스터 기능을 다음과 같이 변경합니다 :

float MyClass::tester(float v){ 
    return 2.0f*v; 
} 

모든 도움을 주실 수 있습니다 (링크 포함)! 나는 문제에 대한 주위에 인터넷 검색을하지만

+2

당신은 "멤버 함수에 대한 C++ 포인터"를해야합니다. BTW, 멤버 함수는 컨텍스트 (객체가'this')가 필요하므로 일반 함수와 같은 방법으로 사용할 수 없습니다. –

+0

'MyClass :: tester'는'MyClass'의 비 정적 멤버에 의존하지 않는 것 같기 때문에 이전에했던 것처럼'static' 또는 무료 함수가되기를 원하십니까? (그리고 나서이 코드는 작동 할 것입니다.) –

답변

4

이것은 클래스의 멤버로 함수를 넣을 때 더 이상 형식이 float (*)(float)이 아니고 float (MyClass::*)(float)이되기 때문입니다.

std::functionstd::mem_fn을 살펴보고 이러한 문제를 해결하십시오.

예 :

struct foo { 
    float bar(int x, int y) {} 
}; 

// This works 
std::function<float(int, int)> func = std::mem_fn(&foo::bar); 
+0

나는 당신이 어느 정도 제안한 것을 시도했지만 더 많은 문제를 야기 했으므로 후속 질문을 게시했습니다. –

2

당신이 다음 float MyClass::tester(float v)Myfunc 가리 키도록 NameOfFunc를 원하는 경우 (I은 아무 소용이 "클래스에서 C++ 구조체의 함수 포인터 초기화"와 같은 일을 시도했습니다) 검색 할 무엇 확실하지 오전 시도 선언은

typedef float (MyClass::*MyFunc)(float); 

해야하지만, 그것은 당신이 중 하나를 가리킬 수있는 하나 개의 유형을 가질 수 있다고 생각하지 않습니다 float tester(float v)를 가리 수 없습니다.

e.MyFunc = tester;e.NameOfFunc = tester;이 아니어야합니까?