함수 객체

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

함수 포인터 단점

 

1) 시그니처가 안 맞으면 사용할 수 없다 

  • pfunc = &HelloNumber;  // 사용불가능
  • 이 경우 *pfunc(void)이기 때문에 int형인 HelloNumber를 받을 수 없다

 

2) 상태를 가질 수 없다

#include <iostream>
using namespace std;
void HelloWorld() { cout << "Hello World" << endl; }
void HelloNumber(int number) { cout << "Hello Number" << number << endl; }
class Knight {
public:
void AddHp(int addHp) { _hp += addHp; }
private:
int _hp = 100;
};
int main()
{ // 함수 포인터 선언
void (*pfunc)(void);
// 동작을 넘겨줄 때 유용하다
pfunc = &HelloWorld;
(*pfunc)();
// 함수 포인터 단점
// 1) 시그니처가 안 맞으면 사용할 수 없다
pfunc = &HelloNumber; // 사용불가능
return 0;
}

 

 


 

 

함수 객체 (Functor)

 

함수처럼 동작하는 객체

 

[함수처럼 동작]하는 객체
() 연산자 오버로딩

 

#include <iostream>
using namespace std;
void HelloWorld() { cout << "Hello World" << endl; }
void HelloNumber(int number) { cout << "Hello Number" << number << endl; }
class Knight {
public:
void AddHp(int addHp) { _hp += addHp; }
private:
int _hp = 100;
};
class Functor {
public:
void operator()()
{
cout << "Functor Test" << endl;
cout << _value << endl;
}
bool operator()(int num)
{
cout << "Functor Test" << endl;
_value += num;
cout << _value << endl;
return true;
}
private:
int _value = 0;
};
class MoveTask {
public:
void operator()()
{
cout << "해당 좌표로 플레이어 이동" << endl;
}
public:
int _playerId;
int _posX;
int _posY;
};
int main()
{
// [함수처럼 동작]하는 객체
// () 연산자 오버로딩
HelloWorld();
Functor functor;
functor();
bool ret = functor(3);
// MMO에서 함수 객체를 사용하는 예시
// 클라 <-> 서버
// 서버 : 클라가 보내준 네트워크 패킷을 받아서 처리
// ex) 클라 : 나 (5, 0) 좌표로 이동시켜줘!
MoveTask task;
task._playerId = 100;
task._posX = 5;
task._posY = 0;
// 나중에 여유 될 때 일감을 실행한다
task();
return 0;
}

 

변경하는 부분과 실행하는 부분이 나누어지는 커맨드 패턴(Command Pattern)으로 만들 수 있다.

 


 

전체 코드

 

더보기
#include <iostream>
using namespace std;
void HelloWorld() { cout << "Hello World" << endl; }
void HelloNumber(int number) { cout << "Hello Number" << number << endl; }
class Knight {
public:
void AddHp(int addHp) { _hp += addHp; }
private:
int _hp = 100;
};
class Functor {
public:
void operator()()
{
cout << "Functor Test" << endl;
cout << _value << endl;
}
bool operator()(int num)
{
cout << "Functor Test" << endl;
_value += num;
cout << _value << endl;
return true;
}
private:
int _value = 0;
};
class MoveTask
{
public:
void operator()()
{
cout << "해당 좌표로 플레이어 이동" << endl;
}
public:
int _playerId;
int _posX;
int _posY;
};
int main()
{
// 함수 포인터 선언
void (*pfunc)(void);
// 동작을 넘겨줄 때 유용하다
pfunc = &HelloWorld;
(*pfunc)();
// [함수처럼 동작]하는 객체
// () 연산자 오버로딩
HelloWorld();
Functor functor;
functor();
bool ret = functor(3);
// MMO에서 함수 객체를 사용하는 예시
// 클라 <-> 서버
// 서버 : 클라가 보내준 네트워크 패킷을 받아서 처리
// ex) 클라 : 나 (5, 0) 좌표로 이동시켜줘!
MoveTask task;
task._playerId = 100;
task._posX = 5;
task._posY = 0;
// 나중에 여유 될 때 일감을 실행한다
return 0;
}

 

 

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

[C++] 템플릿(Template) 2: 클래스 템플릿  (0) 2022.04.17
[C++] 템플릿(Template) 1: 함수 템플릿  (0) 2022.04.16
[C++] 함수 포인터 2  (0) 2022.04.16
[C++] 함수 포인터 1  (0) 2022.04.15
[C++] 전방선언  (0) 2022.04.12