함수 포인터 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