Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/C++] 멤버 함수에 대한 포인터 본문

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;
}

정적 멤버 함수는 원래부터 객체를 사용하지 않고 호출한다. 멤버가 아닌 함수와 호출하는 방법이 동일하다는 뜻이다. 그렇기 때문에 같은 형식의 함수 포인터를 사용할 수 있다.

Comments