함수 포인터를 함수를 가리키는 포인터로 아래와 같은 형식으로 선언한다.
반환형 (*함수포인터이름)(매개변수)
포인터 이름은 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