함수 포인터

이승덱·2021년 7월 21일

CPP

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

using namespace std;

//함수 포인터

//언리얼은 STL을 사용하지 않는다

//하지만 알아두면 좋다.(서버관련 작업 시)

//STL을 이해하기 위해서는 함수 포인터에 대해 알아야한다

int Add(int a, int b) {

    return a + b;

}

int Sub(int a, int b) {

    return a - b;

}

class Item {

public:

    Item() : _itemId(0), _rarity(0), _owerId(0) {

    }

public:

    int _itemId; //아이템 id

    int _rarity; //희귀도

    int _owerId; //소지자 id

};

typedef bool(ITEM_SELECTOR)(Item*, int);

Item* FindItem(Item items[], int itemCount,

    /*동작을 매개변수로 추가*/ITEM_SELECTOR* selector,int value) 

{

    // 안전체크, 공통부분등이 추가될 경우 매우 긴 for문을 사용할 수도 있음

    // 따라서 함수 포인터를 사용

    for (int i = 0;i < itemCount;i++) {

        Item* item = &items[i];

        //TODO 조건

        if (selector(item,value)) {

            return item;

        }

    }

    return nullptr;

}

bool IsRareItem(Item* item,int value) {

    return item->_rarity >= value;

}

//람다식으로 해결

bool IsOwnerItem(Item* item, int ownerId) {

    return item->_owerId == ownerId;

}

int main()

{

    int a = 10;

    //바구니 주소

    //pointer[주소] -> 주소[   ]

    typedef int DATA;

    // 1) 포인터       *

    // 2) 변수 이름    pointer

    // 3) 데이터 타입 int

    DATA* pointer = &a;

    //함수

    typedef int(FUNC_TYPE)(int a, int b);

    //using FUNC_TYPE = int(int a, int b); 이런 식으로 정의 가능

    // 1) 포인터       *

    // 2) 변수 이름    fn

    // 3) 데이터 타입  int(int a, int b)

    FUNC_TYPE* fn;

    fn = Add;

    fn = Sub;

    // 함수의 이름은 함수의 시작 주소 (배열과 유사)

    int result = Add(1, 2); 

    int result2 = fn(1, 2); //기본 문법

    int result3 = (*fn)(1, 2); //함수 포인터는 *(접근 연산자) 붙어도 함수 주소

    cout << result << endl;

    cout << result2 << endl;

    cout << result3 << endl;

    Item items[10] = {};

    items[3]._rarity = 2;

    items[3]._itemId = 3;

    items[4]._owerId = 100;

    items[4]._itemId = 4;

    Item* rareItem = FindItem(items, 10, IsRareItem, 2);

    Item* ownerItem = FindItem(items, 10, IsOwnerItem, 100);

    cout << rareItem->_itemId<<endl;

    cout << ownerItem->_itemId << endl;

    //결론

    //함수를 가리키는 포인터가 있다!

    //함수 포인터를 사용하면 함수를 다른 함수의 매개변수로 사용이 가능 하다!

    return 0;

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

0개의 댓글