프로그래밍/C++

#50. 함수 포인터

코딩하는상후니 2022. 7. 20. 22:09

 

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