멤버 함수 포인터 선언
returnType (className::*pointerName)(parameterTypes);
멤버 함수 포인터에 함수 주소 대입하기
멤버 함수 포인터에 함수 주소를 대입할 때는 일반 함수포인터와는 다르게 & 연산자를 생략할 수 없다.
returnType (className::*pointerName)(parameterTypes) = &className::memberFunctionName;
멤버 함수 포인터 호출하는 법
className object; // 클래스의 인스턴스 생성
(returnType)(object.*pointerName)(arguments);
만약 클래스의 멤버인 멤버 함수 포인터를 멤버 함수 내에서 호출한다면 아래처럼 하면 된다.
(this->*functionPointer)();
사용 예시.
#include <iostream>
class MyClass {
public:
void PrintHello() {
std::cout << "Hello, world!" << std::endl;
}
};
int main() {
MyClass obj;
void (MyClass::*functionPointer)() = &MyClass::PrintHello;
(obj.*functionPointer)(); // 멤버 함수 포인터를 사용하여 PrintHello 호출
return 0;
}
typedef 대신 using 사용해 함수포인터 타입 별칭 만들기
typedef void (*FunctionPointer)(int, double);
using FunctionPointer = void(*)(int, double);
함수 포인터 대신 std::function을 사용하는 방법
std::function 사용하는 방법이다. functioanl 헤더를 포함시켜야 한다.
std::function<반환타입(인수..)> 함수포인터명
#include <iostream>
#include <functional>
void PrintMessage(const std::string& message) {
std::cout << message << std::endl;
}
int Add(int a, int b) {
return a + b;
}
int main() {
std::function<void(const std::string&)> printer = PrintMessage;
std::function<int(int, int)> adder = Add;
printer("Hello, world!"); // PrintMessage 함수 호출
int result = adder(3, 4); // Add 함수 호출
return 0;
}
그리고 함수포인터 대신 function을 쓰면 가장 좋은 이유는 람다식과 같이 사용하면 멤버함수도 담을 수 있다는 것이다!
#include <iostream>
#include <functional>
class Some {
public:
void PrintMessage(const std::string& message) {
std::cout << message << std::endl;
}
};
int main() {
Some some;
// std::function<void(const std::string&)> printer = &Some::PrintMessage; 안됨
std::function<void(const std::string&)> printer = [&some](const std::string x){
some.PrintMessage(x);
};
printer("Hello, world!");
return 0;
}
'프로그래밍 > C++' 카테고리의 다른 글
C++ ] 현재 실행중인 실행파일의 경로 얻기, GetModuleFileName (0) | 2023.09.19 |
---|---|
C++ ] Winsock2의 bind 함수와 functional 헤더의 std::bind 함수 충돌 방지 (0) | 2023.09.17 |
Precompiled Header를 사용해 컴파일 시간 단축하기 (0) | 2023.09.15 |
char, wchar_t, TCHAR (0) | 2023.09.15 |
C++ ] 시스템 명령어 실행 (0) | 2023.07.11 |