メンバー関数ポインタ

1792 ワード

//出典は『コードを楽しむ』コース.
#include <iostream>

using namespace std;


class CPoint
{
private : 
	int x_;

public : 
	//static 함수는 클래스의 멤버 변수에 접근할 수 없다. 
	//내부적으로 this 포인터를 인자로 콜하는 것이 아니기 때문.
	static void hello(int _num)
	{
		//밑의 주석 지우면 오류 발생함.
		//x_ = _num;
	}
};

class Dialog
{
public : 
	void Close() {}
	static void Open() {}
};

void foo() {}

int main(void)
{
	//함수 포인터를 지정할 때 
	//동일한 반환형, 동일한 매개변수를 사용해서 함수를 지정하게 함.
	void(*func)() = &foo;
	//하지만 이처럼 클래스 내부를 할 수 없다.
	//왜냐하면 객체화를 하지 않았으므로
	void(*func2)() = &Dialog::Close;
	

	//=> 여기서 알 수 있는 점 :
	//1번 : 일반함수 포인터에 멤버 함수의 주소를 담을 수 없음.
	//왜냐하면 멤버함수에는 this가 포함되어 있기 때문임

	//2번 : 일반 함수 포인터에 static 멤버함수의 주소를 담을 수 있음. 
	//클래스 내부더라도 어쨋든 this의 속성으로 접근하지 않기 때문.
	void(*func3)() = &Dialog::Open;

	//3번 : 멤버의 함수를 설정하는 멤버함수 포인터가 있음. 
	//멤버 함수 포인터를 사용하는 방법 : .*   (p->*f3)()
	void(Dialog::*func4)() = &Dialog::Close;

	//그렇다면 멤버 함수 포인터를 call 할 수 있음? 
	func4(); 
	//=> 불가능하다... 왜냐하면 클래스의 멤버함수를 호출하기 위해서는 객체화 즉, this가 필요하기 때문

	//그렇다면 어찌할 것인가? 
	//객체화 해서 호출해야 함.
	Dialog d;
	d.func4(); //but, 클래스 Dialog 에서는 멤버함수 func4를 찾을 수 없음

	//c++에서는 멤버함수 포인터를 call 하기 위해 새로운 문법을 만듬. 

	d.*func4(); // error : 연산자 우선순위 문제가 있음.
	(d.*func4)(); // 이런식으로 사용함.


}


知るべきところ
コールバック関数を使用するときに静的関数として使用する場合は、静的内部
クラス内の仮想関数とメンバーにアクセスできません.
  • threadを作成すると、パラメータにスケールしてアクセスします.
    講義の参考.
  • メンバーデータポインタ
    上で作成したメンバー関数ポインタを使用します.
    ただし、オブジェクトではないため、アドレス値を表します.