2013-09-27 2 views
1

필자는 헤더 파일에 다음과 같이 선언 된 함수 그룹과 함수 포인터를 가지고 있습니다.이 함수 포인터가 실패하고있는 이유는 무엇입니까?

public:  // User declarations 
void __fastcall TTopForm::Method1(void); 
void __fastcall TTopForm::Method2(void); 
void __fastcall TTopForm::Method3(void); 
void __fastcall (TTopForm::*Method)(void) ; 

그런 다음 내 프로그램에서이 오류 메시지가 생성이

Method = Method1; 

수행합니다. "멤버 함수를 호출해야 또는 주소가 촬영을" 물론 이걸 시도해 보지만 행운은 없습니다.

Method = &Method1; 

내가 뭘 잘못하고 있니? 나는 회로 전문가이고 코드 전문가는 아니기 때문에 코드를 명시 해주십시오.

답변 해 주셔서 감사합니다. C++ Builder를 사용하고있는 다른 사람들을 위해 내가 한 일을 게시 할 것입니다. 도움말 파일 당 typedef를 사용하고 있습니다. typedef에 __fastcall을 생략하면 내 실수였습니다. 그럼 내 코드에서

class TTopForm : public TForm 
{ 
typedef void (__fastcall TTopForm::* TMethod)(void); 
... 

public:  // User declarations 
void __fastcall TTopForm::Method1(void); 
void __fastcall TTopForm::Method2(void); 
void __fastcall TTopForm::Method3(void); 
... 

는 :

TMethod Method = &TTopForm::Method1; 
(TopForm->*Method)(); 

답변

4

올바른 구문은 Method = &TTopForm::Method1;입니다.

클래스의 멤버 함수는 일반적인 자유 함수와 다른 짐승입니다. 그것들은 전혀 관련이 없다고 생각하는 편이 낫습니다.

위의 구문을 사용하여 주소를 가져올 수 있습니다. 또한 제대로 사용하는 법을 배워야 할 때 많은 것들이 있습니다. 예를 들어 멤버 함수는 항상 객체를 호출해야합니다.

+0

주셔서 감사 구문 작품,하지만 지금은 방법()는 "비 함수 호출"오류가 있습니다 : 예를 들어, 다음은 유효합니다. 귀하의 의견에 따라 함수의 인수 목록에 TObject * Sender를 추가하려고 시도했지만 도움이되지 않았습니다. –

+1

코드를 볼 수는 없지만 질문에서'Method'는 멤버 함수에 대한 * 포인터 *입니다. 호출 할 개체를 제공해야합니다. 예를 들어'tTopForm' 타입의 객체't'를 가지고 있다고 가정하면'(t. * Method)();'와 같이 호출 할 수 있습니다. –

1

이처럼 주소입니다 취할 필요 :

Method = &TTopForm::Method1; 
-1

나는

Method = Method1; 

가되었습니다한다고 생각 :

Method = ObjectOfClass.Method1 

내가 그러나 확실하지 않다.

+0

그것은 실제로 옳지 않습니다. – MSalters

1

제시는 C++ 표준이 기대하는 바에 따라 질문에 대답했습니다. C++ Builder를 특별히 사용하고 있으므로 표준 C++ 메소드 포인터보다 훨씬 더 사용하기 쉽고 훨씬 유연한 __closure 컴파일러 확장을 활용할 수 있습니다. 예를 들어 :

class TTopForm : public TForm 
{ 
    typedef void __fastcall (__closure *TMethod)(void); 
    ... 

public:  // User declarations 
    void __fastcall Method1(void); 
    void __fastcall Method2(void); 
    void __fastcall Method3(void); 
    ... 
}; 

TMethod Method = &Method1; 
Method(); // calls this->Method1() 

은 무엇 유연한 __closure를 만드는 것은 그것이 특정 클래스에 국한되지 않는다는 점이다. 객체 포인터에 대한 참조를 보유하므로 원래 클래스 유형을 전혀 알 필요가 없습니다.,

typedef void __fastcall (__closure *TMethod)(void); 

class TTopForm : public TForm 
{ 
public:  // User declarations 
    void __fastcall Method1(void); 
    ... 
}; 

class TBottomForm : public TForm 
{ 
public:  // User declarations 
    void __fastcall Method1(void); 
    ... 
}; 

TTopForm *TopForm = ...; 
TBottomForm *BottomForm = ...; 
TMethod Method; 

Method = &(TopForm->Method1); 
Method(); // calls TopForm->Method1() 

Method = &(BottomForm->Method1); 
Method(); // now calls BottomForm->Method1(), using the same TMethod variable! 
관련 문제