함수 포인터 2

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

함수 포인터 

 

Ver1.

#include <iostream>
using namespace std;

int Test(int a, int b)
{
    cout << "Test" << endl;
    return a + b;
}

int main(){
    // 1) 포인터        *
    // 2) 변수 이름        fn
    // 3) 데이터 타입    함수 (인자는 int 2개를 받고, int 1개를 반환)
    int (*fn)(int, int);

    fn = &Test; // & 생략 가능 (C언어 호환성 때문이다)
    
    fn(1, 2);    
    (*fn)(1, 2);

    return 0;
}

 

Ver 2.

#include <iostream>
using namespace std;

int Test(int a, int b)
{
    cout << "Test" << endl;
    return a + b;
}

int main(){
    typedef int(FUNC_TYPE)(int, int)
    FUNC_TYPE* fn;

    fn = &Test; // & 생략 가능 (C언어 호환성 때문이다)
    
    fn(1, 2);    
    (*fn)(1, 2);

    return 0;
}


 

typedef

 

typedef 왼쪽 오른값 -> 오른쪽 (커스텀 타입 정의)
정확히는 왼쪽/오른쪽 기준이 아니라, [선언 문법]에서 typedef을 앞에다 붙이는 쪽

 

 

typedef int (*PFUNC)(int, int); 를 사용하여 함수 포인터 활용하기

typedef int (Knight::*PMEMFUNC)(int, int); 를 사용하여 멤버 함수 포인터 활용하기

#include <iostream>
using namespace std;

class Knight{
public:
    // 정적함수
    // static void HellloKnight() {}

    // 멤버 함수
    int GetHp(int, int)
    {
        cout << "GetHp()" << endl;
        return _hp;
    }
public:
	int mfn;
    int _hp = 100;
};

typedef int INTEGER;
typedef int* POINTER;
typedef int ARRAY[20];
typedef int (*PFUNC)(int, int); // 함수 포인터

typedef int (Knight::*PMEMFUNC)(int, int); // 멤버 함수 포인터

int Test(int a, int b)
{
    cout << "Test" << endl;
    return a + b;
}

int main()
{
    PFUNC fn;

    fn = &Test;  // & 생략 가능 (C언어 호환성 때문)

    fn(1, 2);
    (*fn)(1, 2);
    // 위 문법으로 [전역 함수 / 정적 함수]만 담을 수 있다. 호출 제약이 동일한 애들.
    
    Test(1, 2);

    Knight k1;
    k1.GetHp(1, 1);

    PMEMFUNC mfn;
    mfn = &Knight::GetHp; // 멤버함수이기 때문에 & 꼭 붙여야 한다.

    (k1.*mfn)(1, 1); // '멤버 함수 포인터'로 사용할 시에는 *를 꼭 붙여야 한다. 만약 Knight 내에 같은 이름의 변수 mfn이 있는 경우 모호해지기 때문에 '멤버 함수 포인터'를 사용할 때는 *를 꼭 붙여야 한다. 안 붙이면 통과되지 않는다.

    Knight* k2 = new Knight();
    (k2->*mfn)(1, 1);
    delete k2;

    return 0;
}

 

Test(1, 2);와 

 

Knight k1;

k1.GetHp(1, 1); 의 구현 원리는 다르다.

Test(1, 2)는 함수를 바로 호출하지만 Knight 버전의 경우 Knight객체를 기반으로 호출한다. Knight를 생성 후 값을 변화시킨다.


 

전체 코드

 

더보기
#include <iostream>
using namespace std;

class Knight{
public:
    // 정적함수
    // static void HellloKnight() {}

    // 멤버 함수
    int GetHp(int, int)
    {
        cout << "GetHp()" << endl;
        return _hp;
    }

public:
    int _hp = 100;
};

typedef int INTEGER;
typedef int* POINTER;
typedef int ARRAY[20];
typedef int (*PFUNC)(int, int); // 함수 포인터

typedef int (Knight::*PMEMFUNC)(int, int); // 멤버 함수 포인터

int Test(int a, int b)
{
    cout << "Test" << endl;
    return a + b;
}

int main()
{
    PFUNC fn;

    fn = &Test;  // & 생략 가능 (C언어 호환성 때문)

    fn(1, 2);
    (*fn)(1, 2);

    // 위 문법으로 [전역 함수 / 정적 함수]만 담을 수 있다. 호출 제약이 동일한 애들.
    
    Test(1, 2);

    Knight k1;
    k1.GetHp(1, 1);

    PMEMFUNC mfn;
    mfn = &Knight::GetHp; // 멤버함수이기 때문에 & 꼭 붙여야 한다.

    (k1.*mfn)(1, 1);

    Knight* k2 = new Knight();
    (k2->*mfn)(1, 1);
    delete k2;

    return 0;
}

 

 

'⭐ Programming > C++' 카테고리의 다른 글

[C++] 템플릿(Template) 1: 함수 템플릿  (0) 2022.04.16
[C++] 함수 객체  (0) 2022.04.16
[C++] 함수 포인터 1  (0) 2022.04.15
[C++] 전방선언  (0) 2022.04.12
[C++] 캐스팅: static, dynamic, const, reinterpret cast  (0) 2022.04.10