0. 함수 포인터의 단점

(1) 함수의 시그니쳐가 같아야 함

void HelloWorld()
{
	cout << "Hello Worldd" << endl;
}

void (*pfunc)(void);

 

pfunc = &HelloWorld();
(*pfunc)();

 

(2) 상태를 가질 수 없음

 

(3) 문법의 복잡성

 

1. 함수 객체(Functor)

함수처럼 동작하는 객체.

class Functor
{
public:

    void operator()() // () 연산자 오버로딩
    {
        cout << "Functor Test" << endl;
        cout << _value << endl;
    }

private:
    int _value = 0;
};

int main()
{
    Functor functor;

    functor();
}

함수 포인터와는 다르게 상태 값을 가질 수 있고 호출 또한 가능하다.

또한 함수처럼 오버로딩이 가능하다.

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;
    }
private:
    int _value = 0;
};

int main()
{
    Functor functor;

    functor();
    bool ret = functor(3);
}

 

2. 응용

ex) 플레이어가 움직이는 것을 구현하기

class MoveTask
{
public:

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

int main()
{
    Functor functor;

    functor();
    bool ret = functor(3);

    MoveTask task;
    task._playerId = 100;
    task._posX = 5;
    task._posY = 0;
    
}

 

'기초 C++ 스터디 > 객체지향' 카테고리의 다른 글

8-5. 템플릿 기초(2) - 클래스 템플릿  (0) 2023.06.08
8-4. 템플릿 기초(1)  (0) 2023.06.08
8-2. 함수 포인터(2)  (0) 2023.06.08
8-1. 함수 포인터(1)  (0) 2023.06.08
6-7. 전방 선언 vs 포함(#include)  (0) 2023.06.05