오븐 노트

[C++] 함수 포인터 #2 본문

Develop/C++

[C++] 함수 포인터 #2

오 븐 2023. 5. 1. 17:03
#include <iostream>
using namespace std;

class Knight
{
public:

    static void HelloKnight()
    {
        // 정적 함수는 Knight 객체랑은 연관성이 없고 위치만 안에 있음.
        // 특정 객체에 의존적인 정보들을 수정 할 수 없음.
    }

    // 멤버 함수
    int GetHp(int, int)
    {
        cout << "GetHp()" << endl;
        return _hp;
    }

public:
    int _hp = 100;
};

// typedef
// typedef 왼쪽값과 오른쪽값이 있다면 -> 오른쪽값 (커스텀 타입 정의)
//typedef int NUMBER;
// 정확히는 왼쪽/오른쪽 기준이 아니라,
// [선언 문법]에서 typedef을 앞에서 붙이는 쪽

typedef int INTEGER;
typedef int* POINTER;
//typedef int FUNC(int, int); // 이것보다는 어지간해서는 아래의 함수 포인터 선언을 사용 추천 (함수 사용 시 포인터 선언 없이 사용하는 경우가 없음)
typedef int ARRAY[20];
typedef int (*PFUNC)(int, int); // 함수 포인터. 괄호없이 int*로 만들게 되면 int*형 반환을 의미하게 된다.
typedef int (Knight::*PMEMFUNC)(int, int); // 멤버 함수 포인터

int Test(int a, int b)
{
    cout << "Test" << endl;
    return a + b;
}

int t(int a, int b)
{
    cout << "t" << endl;
    return a + b;
}

int main()
{
    //int (*fn)(int, int);
    // 위와 동일한 기능을 하지만 위의 경우를 더 많이 쓰기에 알아만 두자
    //typedef int(FUNC_TYPE)(int, int);
    //FUNC_TYPE* fn;
    PFUNC fn;

    fn = &Test; // 일반 함수의 경우 & 생략 가능 (C언어 호환성 때문) / 하지만 멤버 함수에서 헷갈릴 수 있으므로 통일

    fn(1, 2);
    (*fn)(1, 2);

    // 위 문법으로는 [전역 함수 / 정적 함수]만 담을 수 있다. (호출 규약이 동일한 것들)
    //fn = &Knight::GetHp; // 멤버 함수이므로 호출 불가
    
    // 멤버 함수를 호출하려면 특정 객체의 주소를 넘겨주는 것까지 포함하고 있는 규약을 따라야함.
    Knight k1;
    k1.GetHp(1, 1);

    PMEMFUNC mfn;

    mfn = &Knight::GetHp;   // 멤버 함수의 경우는 &를 반드시 붙여줘야 함.
    (k1.*mfn)(1, 1);        // 멤버 함수는 항상 가리킬 객체가 존재하여야함.
                            // 멤버 함수의 포인터로 사용할 경우에는 함수라는 것을 의미하기 위하여 포인터를 찍어주어야함. 멤버 변수와 혼동 방지

    Knight* k2 = new Knight();

    //(*k2.*mfn)(1, 1);
    (k2->*mfn)(1, 1); // * 이후 . 작성을 -> 하나로 대체 가능
    delete k2;

    return 0;
}

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

 

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

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

[C++] 템플릿 기초 #1  (0) 2023.05.03
[C++] 함수 객체  (0) 2023.05.01
[C++] 함수 포인터 #1  (0) 2023.04.28
[C++] 전방선언  (0) 2023.03.08
[C++] TextRPG (OOP) #1~3  (0) 2023.03.03