함수 객체

이승덱·2021년 7월 21일

CPP

목록 보기
43/70
#include <iostream>

using namespace std;

// 함수 객체(functor) : 함수처럼 동작하는 객체

// 함수 포인터의 단점 -> 완전한 동일한 시그니처로 만든 함수만 포인터로 가질 수 있음

// 함수 포인터 선언

void HelloWorld() {

 cout << "Hello World" << endl;

}

class Knight {

public:

 void AddHp(int addHp) {

 _hp += addHp;

 }

public:

 int _hp = 100;

};

// 함수 객체

class Functor {

public:

 //()연산자 오버로딩

 void operator()() {

 cout << "Functor Test " << _value << endl;

 }

 bool operator()(int num) {

 cout << "Functor Test2" << endl;

 _value += num;

 cout << _value << endl;

 return true;

 }

public:

 int _value = 0;

};

class MoveTask {

public:

 void operator()() {

 cout << "해당 좌표로 이동" << endl;

 }

public:

 int _playerId;

 int _posX;

 int _posY;

};

int main()

{

 //함수포인터

 void (*func)();

 // 동작을 넘겨줄 때 유용

 func = &HelloWorld;

 (*func)();

 // 함수포인터의 단점

 // 1) 시그니처(매개변수 형태)가 안 맞으면 사용할 수 없다.

 // 2) 상태를 가질 수 없다.

 // 함수 객체

 // 함수처럼 동작하는 객체

 // () 연산자 오버로딩

 HelloWorld();

 //상태값을 가진 함수(이 경우 value라는 상태값을 가짐)

 Functor functor;

 functor();

 functor(5);

 // MMORPG에서 함수 객체를 사용하는 예시

 // 클라 <-> 서버

 // 서버 : 클라가 보내준 네트워크 패킷을 받아서 처리

 // ex) 클라 : 나 (5 , 0) 좌표로 이동시켜줘!

 MoveTask task;

 task._playerId = 100;

 task._posX = 5;

 task._posY = 0;

 // 나중에 여유 될 때 일감을 실행

 // 장점 : 실행되는 부분과 일감을 만들어주는 부분이 분리될 수 있다.

 task();

 return 0;

}
profile
공부 기록용 블로그입니다

0개의 댓글