포인터 투 관련 기능을 어떻게 호출합니까?
-
20-09-2019 - |
문제
이해가 안되는 컴파일 오류 (MS VS 2008)를 받고 있습니다. 몇 시간 동안 그것을 엉망으로 만든 후에, 그것은 모두 흐릿하며, 내가 놓친 것이 매우 분명하고 아주 어리석은 것이 있다고 생각합니다. 필수 코드는 다음과 같습니다.
typedef int (C::*PFN)(int);
struct MAP_ENTRY
{
int id;
PFN pfn;
};
class C
{
...
int Dispatch(int, int);
MAP_ENTRY *pMap;
...
};
int C::Dispatch(int id, int val)
{
for (MAP_ENTRY *p = pMap; p->id != 0; ++p)
{
if (p->id == id)
return p->pfn(val); // <--- error here
}
return 0;
}
컴파일러는 화살표가 "용어가 1 인수를 취하는 함수로 평가하지 않는다고 주장한다"고 주장한다. 왜 안 돼? PFN은 하나의 인수를 취하는 함수로 프로토 타입으로, Map_entry.pfn은 PFN입니다. 내가 여기서 무엇을 놓치고 있습니까?
해결책
p->pfn
포인터 투 관련 기능 유형의 포인터입니다. 이러한 포인터를 통해 함수를 호출하려면 어느 작업자를 사용해야합니다. ->*
또는 연산자 .*
유형의 객체를 제공합니다 C
왼쪽 피연산자로. 당신은하지 않았습니다.
나는 어떤 유형의 객체를 모른다 C
여기서 사용해야합니다. 할 수 있습니다 *this
. 이 경우 통화는 다음과 같이 보일 수 있습니다
(this->*p->pfn)(val)
약간 덜 복잡하게 보이게하려면 중간 변수를 소개 할 수 있습니다.
PFN pfn = p->pfn;
(this->*pfn)(val);
다른 팁
노력하다
return (this->*p->pfn)(val);
내 자신의 경험을 쌓기 위해, 나는이 진술로 인한 G ++의 오류를 발견했습니다.
(this -> *stateHandler)() ;
여기서 StateHandler는 *this에 의해 참조 된 클래스의 무효 멤버 함수에 대한 포인터입니다. 문제는 화살표 연산자 사이의 공간으로 인해 발생했습니다. 다음 스 니펫은 잘 컴파일합니다.
(this->*stateHandler)() ;
G ++ (GCC) 4.4.2 20090825 (Prerelease)를 사용하고 있습니다. fwiw.
p-> pfn은 함수 포인터입니다. 기능을 만들려면 * 사용해야합니다. 로 변경
(*(p->pfn))(val)