관리 메뉴

기억을 위한 기록들

함수포인터 + 함수포인터 별칭(콜백함수/고계함수) 본문

C & CPP

함수포인터 + 함수포인터 별칭(콜백함수/고계함수)

에드윈H 2020. 4. 1. 19:00

 

GoF에서 프로토타입 패턴을 공부하던 중  typedef 함수포인터에 거부감을 느끼고 위 링크를 참고해서 학습해 보았다

 

 

 

main 함수 첫줄에서 

 

Spawner* ghostSpawner = new Spawner(spawnGhost); 

 

스포너 생성자에 spawnGhost 함수의 주소를 넘겨준다.

 

이로써 SpawnCallback 포인터는  spawnGhost의 기능을 수행할수 있게 되고,

 

Monster* FirstGhost = ghostSpawner->spawnMonster(5,3); 에서 넘겨준 5와 3을 

 

Monster* spawnMonster(int health,int speed) {
              return spawn_(health,speed);
}

 

에서 받아 spawnGhost의 리턴값  return new Ghost(a,b); 을 넘겨주게 된다. a=5 , b=3 

 

그리하여 Monster* FirstGhost에는 new Ghost(5,3); 이 들어 간셈이다.

 

-*2020.07.02 추가 작성

 

함수포인터의 개념은 간단한다. 변수가 아니라 그냥 함수를 가리키는 포인터라는 것뿐이다.

 

함수포인터를 이용하면 함수 이름 대신 포인터 변수를 사용해서 함수를 호출할 수 있다.

함수 이름이 아니라 포인터 변수를 사용하므로, 프로그램이 실행되는 도중에 호출할 함수를 바꾸는것이 가능하다.

 

반환형 (*함수포인터이름)(매개변수들); 이다.

 

이게 여기서는 Monster*(반환형 몬스터클래스포인트) (*SpawnCallBack(포인터이름))(int, int(매개변수들))이였다.

 

조금 더 쉽게 간단한 정수들로 만들어 보았다.

한눈에 알아보기 쉽다
결과

 

여기서 함수포인터에 typedef가 추가되면 뭐가 달라지는걸까?

 

위 상태에서 함수포인터에 typedef를 추가하니 에러나 난다.

 

컴파일 에러 발생!

함수포인터 별칭을 정의해주면 함수포인터를 매번 만들어 줄 필요가 없다.

 

 

 

좀 더 쓰기 편하고 명확해졌다.

 

 

짜란~

 

결과 값