2013/01/10

C++ 함수 포인터

함수 포인터를 알고는 있었지만 실제 응용을 하려다 보니 막히는 사항이 있어 다시 공부를 좀 하고 정리를 하였다.



함수 포인터를 함수를 가리키는 포인터로 아래와 같은 형식으로 선언한다.

반환형 (*함수포인터이름)(매개변수)



포인터 이름은 C++의 경우 객체의 멤버일 경우 객체까지 선언한다

반환형 (클래스::*함수포인터이름)(매개변수)

// C
int (*ptFunc)(int, int) = NULL;

typedef int (*ptFuncDef)(int, int);
ptFuncDef ptFunc2;


// C++
int (MyClass::*ptMemberFunc)(int, int);
int (MyClass::*ptMemberConstFunc)(int, int) const;

typedef int (MyClass::*ptMemberFuncDef)(int, int);
ptMemberFuncDef ptMemberFunc2;



이렇게 선언된 함수 포인터에 실제 함수의 주소를 할당하여 사용할 수 있다.

// C
int foo(int a, int b) { return a + b; }

ptFunc = foo;
ptFunc = &foo;
ptFunc2 = &foo;

// C++
class MyClass
{
:
public:
int foo(int a, int b) { return a + b; };
int fooConst(int a, int b) const { return a + b; };
}

ptMemberFunc = &MyClass::foo;
ptMemberFunc2 = &MyClass::foo;
ptMemberConstFunc = &MyClass::fooConst;



이러한 함수 포인터는 일반 포인터 변수와 마찬가지로 비교 연산이 가능하다.

그리고 이 함수 포인터에 할당되어 있는 함수를 호출하는 방법은 C형식의 경우 기존 함수 호출방법과 같지만 C++의 경우 객체 생성 방법에 따라 약간 다르다.

// C
int result;
result = ptFunc(1, 2);
result = (*ptFunc)(1, 2);

// C++
MyClass Class;
result = (Class.*ptMemberFunc)(1, 2);
result = (*this.*ptMemberFunc)(1, 2);
result = (this->*ptMemberFunc)(1, 2);

MyClass pClass = new MyClass;
result = (pClass->*ptMemberFunc)(1, 2);



함수 포인터를 특정 함수의 매개변수로 넘기는 방법은 파라메터 입력 부분에 함수 포인터 선언을 해주면 되며 함수내 에서는 포인터 이름으로 해당 함수를 사용할 수있다.


// 함수 포인터를 첫 번째 매개변수로 받는 함수
void RunFuncPtr( int (*ptFunc)(int, int), int a, int b)
{
int result = (*ptFunc)(a, b);
}

//함수 포인터를 매개변수로 받는 함수의 사용 방법
RunFuncPtr( &foo, 1, 2 );



함수 포인터는 또한 특정 함수의 반환 값으로 사용될 수 있다.

아래는 함수 포인터를 반환하는 함수의 선언이다.

int (*getFuncPtr(int a, int b))(int c, int d)
{
:
return &FuncPtr;
}

typedef int (*ptFuncDef)(int, int);
ptFuncDef getFuncPtr2(int c, int d)
{
:
return &FuncPtr;
}



이 함수 포인터는 배열이나 STL의 컨테이너에도 응용하여 사용할 수 있다.<

Original Post : http://neodreamer-dev.tistory.com/694

No comments :

Post a Comment