C++

Function Pointer(함수 포인터) ,CallBack 함수

Nin 2020. 12. 22. 16:02
void Func()
{
   std::cout << "저는 함수입니다";
}

int main()
{
   Func();
}

함수 자체도 위치와 크기가 존재한다.그렇기 때문에

void(*Ptr)() = Func;
Ptr();

이렇게 함수의 위치를 받아와서 Func 함수를 호출 할 수 있다.

이를 함수포인터 이라고 한다.

사용법은 리턴값 (*포인터이름)(인자) = 대입 함수명 

이렇게 사용한다.


게임에서 버튼의 용도는 굉장히 다양하다.

class Button
{
public:
   int ImageIndex;
   int X;
   int Y;
   
public:
   void Click()
   {
   
   }
};

위와 같이 버튼 클래스를 만들고

게임에서 사용 할 버튼이 3개 있다고 가정하자. (메뉴 버튼, 공격 버튼 , 이동 버튼)


class ButtonBase
{
public:
   int ImageIndex;
   int X;
   int Y;
};

class AttButton : public ButtonBase
{
public:
   void Click()
   {
      std::cout <<" 공격\n";
   }
};

class MoveButton : public ButtonBase
{
public:
   void Click()
   {
      std::cout <<" 이동\n";
   }
};

class MenuButton : public ButtonBase
{
public:
   void Click()
   {
      std::cout <<" 메뉴\n";
   }
};

위의 코드처럼 부모 클래스 ButtonBase를 만들고 이를 상속받아서

각각의 AttButton,MoveButton,MenuButton 자식클래스 만들어서

해결할 수도 있다.


class Button
{
public:
   int ImageIndex;
   int X;
   int Y;
   
   void(*CallBack)();  //콜백 함수
   
public:
   Button(void(*_CallBack)) : CallBack(_CallBack)
   {
   
   }
public:
   void Click()
   {
      CallBack();
   }
};

void Move()
{
   std::cout << " 이동\n";
}

void Attack()
{
   std::cout << " 공격\n";
}

void Menu()
{
   std::cout << " 메뉴\n";
}

int main()
{
   Button AttButton = Attack;
   Button MoveButton = Move;
   Button MenuButton = Menu;
   
   AttButton.Click();
   MoveButton.Click();
   MenuButton.Click();
}

이렇게 함수 포인터를 이용해서 콜백 함수를 만들어서 해결이 가능하다.

클래스를 많이 사용하지 않는다는 장점이 있다.

여기서 Att,Move,MenuButton은 모두 같은 클래스에

같은 함수를 사용한다.

그치만 실행됬을때 하는 일을 다 다르다.

이를 객체지향의 특성중 하나인 다형성이라고 한다.


객체지향의 특성

사용자정의 자료형과 오브젝트 = 캡슐화 

                                          (내부에 행동과 상태를 하나로 묶고 그것을 메모리화 해서 사용.)

상속 = 코드재활용,기존의 코드를 상속시켜서 코드량을 줄인다.

다형성 = 겉으로 보기에는 같아보이지만 내부에서 하는일이 달라진다.(오버로딩,함수포인터 등)

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

Template  (0) 2020.12.23
멤버함수에서 함수포인터 사용  (0) 2020.12.22
ClassBytePadding(바이트패딩)  (0) 2020.12.22
깊은복사,얕은복사  (0) 2020.12.22
Is A 관계,Has A 관계  (0) 2020.12.22