[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
댓글을 사용할 수 없습니다.