MFC의 경우는 대부분의 함수들이 특정 Class의 Member Function이다. 대부분의 UI나 Event 관련 구현은 MainFrame (ChildFrame) , View , Dialog 의 Member Function 으로 구현 될 것이다. 여기에서 Function Poiner를 사용할 경우 아래 몇가지만 기억하면 쉽게 가능하다.
1. 선언 : &Class::Function (static도 동일)
2. Member 함수 내에서의 사용 : (this->*funcPtr)();
3. Non-static 함수 사용 : (Object.*funcPtr)() 또는 (ObjPtr->*funcPtr)()
4. static 함수 사용 : (*funcPtr)() (일반 Function Pointer와 동일)
아래 예제를 보면 이해가 쉽게 될 것이다.
class Widget
{
private:
int x, y;
public:
Widget() : x(0), y(0) {}
int AddX(int a) { x += a; return x; }
int AddY(int a) { y += a; return y; }
int Add(int (Widget::*funcPtr)(int), int a)
{
return (this->*funcPtr)(a);
}
static int Add(int a, int b) { return a + b; }
int Add2(int(*funcPtr)(int, int), int a, int b) { return (*funcPtr)(a, b); }
};
void main()
{
// 선언은 &Class::Function
auto funcA = &Widget::AddX;
int (Widget::*funcB)(int) = &Widget::AddY;
// 사용은 (Obj.*funcPtr) 또는 (objPtr->*funcPtr)
Widget W;
int rX = W.Add(funcA, 10); // 10
int rY = (W.*funcB)(20); // 20
Widget* pW =
&W;
int rX2 = (pW->*funcA)(5); // 15
// static의 경우도 선언은 &Class:Function
int(*funcC)(int, int) = &Widget::Add;
// 사용은 Class:: 없이 단독 (일반 함수Ptr과 동일)
int rC = (*funcC)(10, 20); // 30
int rC2 = W.Add2(funcC,
(W.*funcB)(20), W.Add(funcA, 10)); // 65
return;
}
|
참조 : http://support.microsoft.com/kb/94579/ko
댓글 없음:
댓글 쓰기