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 |