Post List

2015년 1월 7일 수요일

C++ Class Member Function의 Function Pointer

C++는 Function의 Pointer를 이용하여 Parameter로 전달한다던지 return을 하는 것이 가능하다. 이를 이용하면 함수내에 한,두 곳만 다른 함수들이 여럿 있으면 그 다른 부분만 별도의 함수로 정의하여 매개변수로 넘겨주는 식으로 구현을 하면 Code의 중복을 많이 줄일 수 있으며 나중에 수정을 할때도 중복을 많이 피할 수 있다.

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





댓글 없음:

댓글 쓰기