오븐 노트

[C++] 함수 객체 본문

Develop/C++

[C++] 함수 객체

오 븐 2023. 5. 1. 17:32
#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; // Knight의 상태값
};

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()()
    {
        // TODO
        cout << "해당 좌표로 플레이어 이동" << endl;
    }

public:
    int _playerId;
    int _posX;
    int _posY;
};

int main()
{
    // 함수 객체 (Functor) : 함수처럼 동작하는 객체
    
    // 함수 포인터 선언
    
    void (*pfunc)(void);

    // 동작을 넘겨줄 때 유용하다
    pfunc = &HelloWorld;
    (*pfunc)();

    // 함수 포인터 단점
    // 1) 시그니처가 안 맞으면 사용할 수 없다.
    // 2) 상태를 가질 수 없다
    //pfunc = &HelloNumber; // <- 시그니처 안맞음

    // 함수 객체란? [함수처럼 동작]하는 객체
    // () 연산자 오버로딩
    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;
}

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
 
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.

 

모든 글은 제가 공부하기 위해 작성합니다.

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

[C++] 템플릿 기초 #2  (0) 2023.05.03
[C++] 템플릿 기초 #1  (0) 2023.05.03
[C++] 함수 포인터 #2  (0) 2023.05.01
[C++] 함수 포인터 #1  (0) 2023.04.28
[C++] 전방선언  (0) 2023.03.08