함수포인터에서 this
1. 일반 함수포인터에 멤버함수의 주소를 담을 수는 없다.
2. 일반 함수포인터에 static 멤버함수의 주소를 담을 수는 있다.
다음의 예제에서..
class Dialog { public: void Close() {} static void Close2() {} }; void foo() {} int main() { void(*f1)() = &foo; //함수포인터 f1 f1(); (*f1)(); void(*f2)() = &Dialog::Close; // error void(*f3)() = &Dialog::Close2; // ok.. this가 없다. }
함수포인터 f1()는 인수가 없는 void 함수를 담는 함수포인터이다.
위의 그림만 봤을 때 f2(), f3() 역시 일치하는 Close와 Close2를 갖고있기 때문에 아무 문제 없어보이나 f2()의 경우에는 컴파일에러가 나는 것을 확인할 수 있다.
이는 멤버함수인 Dialog의 Close()함수가 사실은 this 인자를 받고 있기 때문에 문제가 있는 것이다.
반면 f3()의 경우에는 static함수 Close2는 this가 없어 인수가 일치하기 때문에 아무 문제 없다.
이를 해결하기 위해서는 다음과 같이 멤버함수의 함수 포인터를 만들고 사용하면 된다.
void(Dialog::*f)() = &Dialog::Close;
Dialog dlg; (dlg.*f)();
*반드시 객체를 생성해줘야 실행이 된다.
728x90
'Software Development > C, C++' 카테고리의 다른 글
2_new2_예제 (0) | 2014.07.21 |
---|---|
2_new1_new,operator new, operator delete (0) | 2014.07.20 |
1_this4_다중 상속의 멤버함수 포인터 (0) | 2014.07.20 |
1_this3_멤버 변수의 포인터 (0) | 2014.07.20 |
1_ this1 (0) | 2014.07.20 |