[C++] 함수 포인터 2
함수 포인터 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 |
댓글
이 글 공유하기
다른 글
-
[C++] 템플릿(Template) 1: 함수 템플릿
[C++] 템플릿(Template) 1: 함수 템플릿
2022.04.16 -
[C++] 함수 객체
[C++] 함수 객체
2022.04.16 -
[C++] 함수 포인터 1
[C++] 함수 포인터 1
2022.04.15 -
[C++] 전방선언
[C++] 전방선언
2022.04.12