[C++] 함수 객체
함수 객체
인프런 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 |
댓글
이 글 공유하기
다른 글
-
[C++] 템플릿(Template) 2: 클래스 템플릿
[C++] 템플릿(Template) 2: 클래스 템플릿
2022.04.17 -
[C++] 템플릿(Template) 1: 함수 템플릿
[C++] 템플릿(Template) 1: 함수 템플릿
2022.04.16 -
[C++] 함수 포인터 2
[C++] 함수 포인터 2
2022.04.16 -
[C++] 함수 포인터 1
[C++] 함수 포인터 1
2022.04.15