2

예제를 통해 내 질문에 설명해주십시오 (VC++ 코드 VS2013 사용). 이 코드 IN 클래스 멤버 함수 (클래스 B) 클래스를 통해 VC++에서 함수 포인터

void Imhere(int num) 
{ 
    printf_s("\n Hello World printed %d\n",num); 
} 
class Abc; 
class Dllclas 
{ 
    public: 
    void dllFunc() 
    { 
     printf_s("\n Heelo this is DLl func\n"); 
    } 
}; 

void outsideFunc() 
{ 
    printf_s("\n Heelo this is outside func\n"); 
} 
typedef void(*outsideFP)(); 
typedef void (Dllclas::*funcFP)(); 
class Abc 
{ 
public: 
    funcFP fp; 
    outsideFP outFp; 
    int a; 
    void assignOUTFp() 
    { 
     outFp = &outsideFunc; 
    } 
    void assignFP() 
    { 
     fp = &(Dllclas::dllFunc); 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    Abc* abcObj1 = new Abc(); 
    abcObj1->a = 7; 

    abcObj1->assignOUTFp(); 
    abcObj1->outFp(); // THIS FUNCTION CALL WORKS PERFECTLY FINE. 

    abcObj1->assignFP(); 
    abcObj1->fp(); // COMPILATION ERROR. 

, 마지막 줄에

abcObj1-> FP(); // COMPILATION ERROR.

컴파일 오류가 발생합니다.

오류 C2064 : 항은 0 인수

또한

나는 ") (abcObj1-> FP"를 통해 내 마우스를 올려 놓으면, 내가 읽는 빨간색 오류를 복용 함수에 평가하지 않습니다 " 분명 전화의 괄호를 이전

표현은 내가 여기 (포인터 대) 함수 타입

이 있어야합니다 함수를 호출 할 수있다 "abcObj1-> outFp(); 어떤 수업에도 속하지 않습니다. 따라서이 오류가 발생하는 이유는 "abcObj1-> fp();에 현재 함수 주소가 있기 때문입니다." Dllclas 클래스의 클래스 멤버 함수, 즉 "dllFunc()에 속한다. 나는 또한 링크 link에 대해 참조하지만 컴파일 오류를 확인할 수 없습니다

.

나는 코드 샘플에 도움을받을시겠습니까? 미리 감사 제 에러가 제거 괄호로 고정 될 수

+0

'FP'멤버를 찾을 수 없습니다. 'fp'라고 했니? – dasblinkenlight

+0

예, "fp"이고 "FP"(오타)가 아닙니다. 죄송합니다. 지금 바로 수정했습니다. 감사. – codeLover

+0

'fp'는'Dllclas'의 멤버에 대한 포인터입니다. 'Dllclas' 인스턴스없이'dllFunc'를 직접 호출 할 수없는 것처럼 그 멤버를 호출 할'Dllclas' 인스턴스가 필요합니다. –

답변

1

:. 해결

fp = &Dllclas::dllFunc; // This will compile 

번째 문제가 어렵게된다 : 위해 부재 호출 리콜

  • 함수에 대한 포인터 및
  • 함수를 호출하는 객체 : 당신이 두 가지를 필요로 작동합니다.

따라서, 당신은뿐만 아니라 유형 Dllclas의 "대상"개체가 필요합니다

Dllclas target; 
(target.*abcObj1->fp)(); 

구문은 여기에 조금 미친 짓이야 - .* 호출 대상에 abcObj1->fp을 통해 얻은 함수 포인터를 적용, 즉 Dllclas 유형의 객체입니다.이름 때문에

Dllclas *targetPtr; 
(targetPtr->*abcObj1->fp)(); 
+0

완벽한 덕분에. – codeLover

1

이 멤버 함수 포인터 fx 경우를 호출하는 구문은 포인터가

(x->*f)(); 

입니다 : 대신 대상 자체의 대상에 대한 포인터가있는 경우, ->* 연산자를 사용 당신은 단순화 할 수 있습니다 (_tmain에서) 귀하의 회원 포인터가 abcObj->fp, 당신은

(abcObj->*(abcObj->fp))(); 

를 사용할 필요가 Abc에 다른 회원을 추가하여

void callFP() 
{ 
    (*fp)(); 
}