[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
댓글을 사용할 수 없습니다.