*함수포인터 선언
typedef int (*FUNC_TYPE)(int, int);
using FUNC_TYPE = int(*)(int, int);
FUNC_TYPE fn = Add;
FUNC_TYPE fn = &Add;
cout << fn(1, 2) << endl;
cout << (*fn)(2, 3) << endl;
=> 이 문법으로는 [ 전역 / 정적 함수 ] 만 담을 수 있다!!
어떤 클래스의 멤버함수를 담을 수 없음.
typedef int(Knight::*PMEMFUNC)(int, int);
using UPMEMFUNC = int(Knight::*)(int, int);
PMEMFUNC t = &(Knight::GetHP);
(k1.*t)(4, 4);
Knight* k2 = new Knight();
(*k2.*t)(1, 2); // t 를 ( ) 로 감싸면 안됨.
(k2->*t)(1, 2);
delete k2;
=> 클래스 범위가 존재해야함.
*함수의 이름은 함수의 시작 주소 ( 배열과 유사 )
typedef int DATA;
int a = 10;
DATA* pointer = &a;
*함수포인터 선언방식
typedef int (FUNC_TYPE)(int, int);
=> 옛날 방식
using FUNC_TYPE = int(int, int);
=> Morden C++
FUNC_TYPE* fn = Add;
FUNC_TYPE* fn = &Add;
cout << fn(1, 2) << endl;
cout << (*fn)(2, 3) << endl;
=> 함수 포인터는 * 가 붙어도 똑같은 함수 주소!!
=> C++ 에서는 둘 다 허용해줌.
*어느 상황에 유용할까 ??
=> 같은 매개변수 함수들을 주소만 바꾸면서 손쉽게 바꿀 수 있다.
typedef bool(ITEM_SELECTOR)(Item*);
Item* FindItem(Item item[], int itemCnt, bool(*func)(Item*))
{
for (int i = 0; i < itemCnt; ++i)
{
Item* Ret = (item + i);
if (func(Ret)) return Ret;
}
return nullptr;
}
bool IsRareItem(Item* Item)
{
return (Item->_rarity > 10);
}
*단점은 '함수 시그니처' 를 맞춰야한다는 점. 유동적이진 못하다.
*typedef 의 진실
=> int 는 NUMBER 이다.
typedef int NUMBER;
=> 변수가 복잡해지면 단순해지지 않음.
=> 왼쪽 오른쪽 이라고 생각하지말고
[선언 문법] 에서 typedef 을 앞에다 붙이는 것이라 생각하자.
typedef int INTEGER;
typedef int* POINTER;
typedef int ARRAY[20];
typedef int FUNC(int, int);
typedef int FUNC(int, int);
FUNC t;
=> 이렇게는 거의 사용할 일이 없다.
=> 이 방식은 단지 't' 라는 함수를 선언하는 것과 다를 바 없다.
1. FUNC* fn;
2. typedef int (*FUNC)(int, int);
=> 보통 위 2가지 방법으로 사용.
=> 즉, 함수의 주소를 저정하는 공간이어야 함.
'프로그래밍 > C++' 카테고리의 다른 글
#52. 함수 템플릿 (0) | 2022.07.20 |
---|---|
#51. 함수 객체 (0) | 2022.07.20 |
#49. 전방 선언 (0) | 2022.07.20 |
#48. C++ 캐스팅 (0) | 2022.07.20 |
#47. 깊은 복사 & 얕은 복사 (0) | 2022.07.20 |