C++/C++

멤버 함수 포인터(Member Function Pointer)

Elan 2022. 2. 11. 19:23

다소 생소한 문법인 멤버 함수 포인터에 대해 알아보자.(추가로 멤버 

자주 사용되지 않는 문법이라 잊어버리거나 모를 수도 있다.

 
class A {

public:
	void Test(){
		std::cout << "A::Test()\n";
	}

	static void TestStatic() {
		std::cout << "A::TestStatic()\n";
	}

	int t;
};

class B {
public:
	void Test() {
		std::cout << "B::Test()\n";
	}

	static void TestStatic() {
		std::cout << "B::TestStatic()\n";
	}
};

void (A::*mem_func_ptr)() = &A::Test; // Member function pointer는 해당 class의 멤버만 가리킬 수 있다. ( 참조기호 &를 안붙여도 상관 없음 )

int(A::* mem_ptr) = &A::t; // Member variable pointer는 해당 타입과 일치하는 멤버 변수만 가리킬 수 있다.

void (*mem_func_ptr2)() = &A::TestStatic; // static 함수는 전역 함수가 같이 취급하기 때문에 멤버 함수 포인터를 사용하지 않는다.
void Test() { std::cout << "Test()\n"; }

void (*func_ptr)() = Test;
//void (A::*pt4)() = Test; // Error : 멤버 함수 포인터는 전역 함수를 가리킬 수 없다

int main() {
	
	A a=A(); // 멤버 함수 포인터를 사용하기 위해 인스턴스 생성
    
	(a.*mem_func_ptr)(); // 일반 함수포인터와 달리 호출을 위해서는 객체의 인스턴스가 필요하다
    
    (a.*mem_ptr) = 10; // 멤버 변수 포인터를 이용하여 10 할당
	std::cout << a.t << std::endl;
    
	func_ptr(); // 일반 함수 포인터 호출
    
    mem_func_ptr2(); // static 함수는 멤버 함수가 아닌 전역 변수로 친다.
    
}