C++프로그래밍/자료구조,알고리즘(추후확장)

콜백함수

season97 2024. 9. 27. 11:18

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로

C++에 대한 구체적인 정보를 담고 있지 않습니다.


더보기

# 람다와 std::fuction을 사용하고 있지 않는 포스팅

 

▶ 콜백 함수 (함수포인터, 함수객체, 템플릿을 활용한...)

 

ㆍ 전화 콜백해줘랑 같은말이다 걍 

ㆍ 다시 호출하다, 역으로 호출하다

ㆍ 게임을 만들 때 콜백 개념이 자주 등장한다.

ㆍ 어떤 상황이 일어나면 -> 이 기능을 호출해줘 
 ex) UI 스킬 버튼을 누르면 -> 스킬을 쓰는 함수 호출

 

# 함수 포인터

class Item
{
public:

public:
    int _itemId = 0;
    int _rarity = 0;
    int _ownerId = 0;
};

Item* FindItem(Item items[], int itemcnt , bool(*func)(const Item*))
{
    for (int i = 0; i < itemcnt; i++)
    {
        Item* item = &items[i];
        //TODO 조건....
        return item;
    }
    return nullptr;
}

ㆍ 원래는 저렇게 함수포인터를 인자로 받아서 아이템을 서칭했었다.


ㆍ 하지만 함수포인터는 인자를 가질 수 없다는 치명적인 단점이 있었다


ㆍ 함수 객체를 이용해 조건을 만들어보자

 

# 함수 객체

class FindByOwnerId
{
public:
    bool operator()(const Item* item)
    {
        if(item->_itemId == _ownerId)
        {
            return true;
        }
        return false;
    }

public:
    int _ownerId;
};

class FindByRarity
{
public:
    bool operator()(const Item* item)
    {
        if (item->_rarity == _rarity)
        {
            return true;
        }
        return false;
    }

public:
    int _rarity;
};

ㆍ 아이템 아이디를 받는 버전, 레어도를 받는 버전을 만들어봤다.

 

Item* FindItem(Item items[], int itemcnt, FindByOwnerId selector)
{
    for (int i = 0; i < itemcnt; i++)
    {
        Item* item = &items[i];
        if (selector(item))
        {
            return item;
        }
        return item;
    }
    return nullptr;
}

ㆍ 이렇게 selector을 인자로 받아 사용할 수 있겠다... 아니근데 그럼 레어 받는버전, 아이디 받는버전... 등등

ㆍ 사양에 따라 함수를 여러개 만들어야 할까??

 

# 템플릿 활용

template<typename T>
Item* FindItem(Item items[], int itemcnt, T selector)
{
    for (int i = 0; i < itemcnt; i++)
    {
        Item* item = &items[i];
        if (selector(item))
        {
            return item;
        }
        return item;
    }
    return nullptr;
}

ㆍ 공통적인 부분은 FindItem에서 정의하고, 특정 조건(만족조건)만 T를 수정해(콜백 함수로 구현 후 인자 바꾸기) 

바꿀 수 있겠다. 

 

int main()
{
    Item items[10];


    FindByOwnerId func1;
    func1._ownerId = 100;


    FindByRarity func2;
    func2._rarity = 1;

    FindItem(items, 10, func1);
    FindItem(items, 10, func2);
    
    return 0;
}

 

ㆍ 기초 개념은 이런거라는 것을 알아두자

'C++프로그래밍 > 자료구조,알고리즘(추후확장)' 카테고리의 다른 글

vector와 iterator  (1) 2024.09.28
vector의 동작 원리(size / capacity)  (0) 2024.09.28
클래스 템플릿  (0) 2024.09.27
템플릿 기초 (함수템블릿)  (0) 2024.09.27
함수객체  (0) 2024.09.27