본문 바로가기

프로그램-잉/C++

멤버함수 포인터

C++은 함수 포인터가 있습니다.

포인터가 주소를 저장한 변수이고 함수또한 특정 주소에 저장된 값이죠.

그러므로 함수포인터는 그 함수의 주소를 가리키고 있는것입니다

 

멤버 함수 포인터는 클래스의 멤버 함수를 가르키고 있는 포인트 변수 겠지요

그럼 이게 뭐가 다를까요?

 

지난 번에 이야기했듯이 멤버함수는 첫번째 숨겨진 패러미터로 this를 가지고 있습니다.

일반 함수포인터에 멤버함수를 넣으면 패러미터가 달라서 에러가 뜨게 됩니다.

그럼 this가 없는 Static 함수는 대입이 가능한가요?

넵! Static함수는 대입이 가능합니다.

 

이제부터 아래코드를 보시죠

// 핵심 1. 일반함수 포인터에 멤버함수의 주소를 담을 수 없다.
// 핵심 2. 일반 함수 포인터에 static 멤버함수의 주소를 담을 수 있다.
// 핵심 3. 멤버 함수 포인터 모양과 사용법 .*   
class Dialog
{
 public:
    void Close(){}
};

void foo(){}
int main()
{
    void(*f1)() = foo;
//    void(*f2)() = &Dialog::Close; //error this가 추가되는 함수
    void(Dialog::*f2)() = Dialog::Close; //멤버함수 포인터
    //f2(); //error 객체(this)가 없다.
    Dialog dlg;
    //dlg.f2(); //dlg.Close의 의미 하지만 f2라는 멤버를 찾게된다.
    //dlg.*f2() //".*" Pointer to mementer operator 연산자 우선순위 문제..
    (dlg.*f2)();
    (*f1)();
}

그럼 일반 멤버함수는 포인터에 어떻게 넣지?

바로 '클래스네임::'을 함수 식별자 앞에 붙이면 됩니다.

쉽죠?😏

 

호출도 일반 함수랑은 다릅니다 함수 객체를 생성한 후 그냥 dot연산자로 찍으면 멤버에서 함수포인터 식별자를 찾게되고 에러가 뜹니다.

 

이때는 .* 연산자를 사용합니다 이 연산자는 포인터 투 멤버 연산자인데요

연산자를 사용할때 그냥사용하게 되면 연산자 우선순위에 따라 ()연산자가 더 우선순위가 높기때문에 오류가 납니다

적다보니 까다롭네🤨

 

(객체.*함수포인터)() 이런식으로 호출 해주어야 정상적으로 호출이 가능합니다.

 

함수포인터는 콜백등에서도 많이 사용하니까 알아두시면 좋음니다.

 

감삽니다.

 

레퍼런스.

boycoding.tistory.com/233

 

C++ 08.09 - 함수 포인터 (function pointer)

함수 포인터 (function pointer) 포인터가 다른 변수의 주소를 저장하는 변수라는 것을 배웠다. 이와 유사하게 함수 포인터(function pointer)는 함수를 가리키는 변수다. 즉, 함수의 주소를 저장하는 변수

boycoding.tistory.com

 

'프로그램-잉 > C++' 카테고리의 다른 글

타이머 만들기  (0) 2020.11.03
스레드 만들기  (0) 2020.10.29
[C++] Method Call  (0) 2020.10.26
VS Code C++ 17 사용법  (0) 2020.10.25
VS Code에서 Boost Library 사용법  (0) 2020.10.24