Programming/C++
[Programming/C++] 멤버 함수에 대한 포인터
scii
2023. 1. 16. 01:51
일반적인 함수에 대한 포인터를 만들던 방식으로는 멤버 함수를 가리킬 수 없다. 멤버 함수에 대한 포인터를 만드는 문법은 조금 다르기 때문이다.
#include <iostream>
using namespace std;
// void XX() 형태의 함수에 대한 포인터
typedef void (*FP1)(int);
// void Point::XX() 형태의 멤버 함수에 대한 포인터
typedef void (Point::*FP2)(int);
int main(int argc, const char * argv[]) {
Point pt(12, 34);
FP1 fp1 = &Point::SetX; // 오류
FP2 fp2 = &Point::SetX; // 성공
// 함수 포인터를 사용해서 함수 호출
(pt.*fp2)(100);
return 0;
}
(pt.*fp2)(100) 코드는 일단 멤버 함수기때문에 어떤 객체의 멤버 함수를 호출할지 지정해줄 필요가 있다. 그래서 객체 pt의 이름을 써주었다. 그리고 fp2는 포인터이기 때문에 *fp2처럼 만들어서 '포인터가 가리키는 함수'를 의미하게 만든다.
함수 호출을 위한 ( ) 연산자는 우선 순위가 매우 높기 때문에 괄호를 사용해서 pt.*fp2가 먼저 해석되게 만든다.
정적 멤버 함수에 대한 포인터
정적 멤버 함수의 경우에는 멤버가 아닌 함수에 대한 포인터를 그대로 사용하면 된다.
#include <iostream>
using namespace std;
class Example{
public:
static void Count();
};
typedef void (*FP)();
int main(int argc, const char * argv[]) {
FP fp = &Example::Count;
fp();
return 0;
}
정적 멤버 함수는 원래부터 객체를 사용하지 않고 호출한다. 멤버가 아닌 함수와 호출하는 방법이 동일하다는 뜻이다. 그렇기 때문에 같은 형식의 함수 포인터를 사용할 수 있다.