typedef를 통해 타입을 재정의 했던 것처럼 함수도 타입을 재정의 할 수 있다.

 

// 반환값(이름)(매개변수)
typedef int(FUNC_TYPE)(int, int);

 

함수의 이름은 함수의 시작 주소를 들고있는것과 같다. (마치 배열과 유사함)

 

FUNC_TYPE* fn;
fn = Add;

int result = fn(1, 2);
int result2 = (*fn)(1, 2); // 둘다 완벽하게 동일하게 동작

 

재정의가 된 함수는 기존의 포인터 변수처럼 사용할 수 있다.

함수 포인터는 *(접근 연산자)이 붙어도 함수 주소에 접근한다.

 

함수 포인터는 함수의 인자로 건네줄 수도 있다. 동작 자체를 넘겨주는 것과 같다.

인자로 넘겨주는 경우 따로 재정의를 하지 않고 매개변수에서 바로 선언할 수 있다.

 

Item* FindItem(Item* items, bool(*selector)(Item* item)) // FUNC_TYPE* selector
{
	// ..
}

 

재정의를 했는데 포인터를 붙이지 않고 사용하는 것은 전방선언만 해놓은 것을 사용하겠다고 하는것과 같기 때문에 컴파일 오류가 발생한다. 실제로 메모리에도 잡히지 않는다.

 

보통은 포인터까지 붙여서 한번에 재정의를 하는 편이다.

 

typedef int(*PFUNC)(int, int);

 

다만 여태까지의 문법으로는 전역 함수와 정적 함수만 담을 수 있다. (호출 규약이 동일한 것들)

멤버 함수는 자기 자신의 객체를 넘겨주는것부터 시작하기 때문에 호출 규약이 맞지 않다.

 

typedef int(Knight::*PMEMFUNC)(int, int);

 

멤버 함수 포인터는 이렇게 선언할 수 있다.

사용은 조금 복잡한 편이다.

 

Knight k1;

PMENFUNC mfn;
mfn = &Knight::GetHP; // 반드시 &를 붙여주어야 한다

(k1.*mfn)(1, 2); // 반드시 *을 붙여주어야 한다

'C++ > Rookiss C++' 카테고리의 다른 글

[콜백 함수] 템플릿 기초  (0) 2022.08.30
[콜백 함수] 함수 객체  (0) 2022.08.30
[디버깅]  (0) 2022.08.30
전방선언  (0) 2022.08.29
[동적 할당] 캐스팅 4총사  (0) 2022.08.29

+ Recent posts