Notice
Recent Posts
Recent Comments
Link
오븐 노트
[C++] 함수 포인터 #2 본문
#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 |