함수 객체

 

인프런 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