함수포인터
1. int Function(int a) {... } ; 로 정의된 함수가 있다치자.
2. 위 1의 함수의 포인터(함수이름이 포인터임)를 받을 수 있는 함수포인터 변수 pFunc 선언하고 1의 함수포인터를 대입하는 방법
int (*pFunc)(int) = Function;
3. 2처럼 대입하고나서, pFunc(1); 이라고 호출하면 Function(1); 이 호출되는 것임.
4. 1의 함수를 다른 함수 "myfunc" 의 입력인자 로 전달하기 위한 다른 함수 "myfunc" 정의 방법.
void myfunc( int (*pFunc)(int) )
{
pFunc(1);
}
myfunc 호출시 상기1의 함수를 인자로 전달하는 법 : myfunc(Function);
5. 상기2와 같은 함수포인터 변수를 사용자 타입정의하는 법..
typedef int(*pFunc)(int);
6. 상기 5에서 선언된 타입으로 변수 선언하는법.
pFunc my_pfunc1;
pFunc my_pfunc2;
7. 상기 5에서의 사용자 정의 타입으로 상기 4의 함수포인터 전달하는 인자 부분 변경하면,
void myfunc( pFunc p_func )
{
p_func(1);
}
mufunc 호출시 상기1의 함수를 인자로 전달하는 법 : myfunc(Function);
콜백개념
8. "이곳"에 있는 함수를 다른곳(예. 다른 클래스 개체, DLL등 )에 전달하여 다른 곳에서 "이곳"의 함수를 호출하는 법 <- 이런걸 콜백이라 부름.
"다른 곳"으로 "이 곳"의 함수를 전달하고 "다른 곳"에서 "이곳"의 함수를 호출하게 하는 것.
"다른 곳" 코딩.
typedef int(*pFunc)(int);
pFunc your_func; // "이 곳"의 함수를 받을 함수포인터변수 선언이다.
//"이 곳"의 함수포인터로 인자를 전달하면 your_func 으로 대입해두는 함수.
void regi_func(pFunc p_func)
{
your_func = p_func; // 인자로 전달받은 함수포인터를 your_func 에 대입했다.
}
//
void exec_func()
{
your_func(1); // regi_func 의 인자로 전달된 함수가 실행되는 것임.
}
"이곳 " 코딩.
이곳에는 int Function(int a) {... } 함수가 정의되어있는데 이 함수를 "다른 곳" 의 regi_func 을 호출하면서 함수포인터를 전달한다.
regi_func(Function);
작동방식 요약.- 콜백 작동 개념임.
위와 같이 Function 이라는 함수포인터는 "다른곳" 의 regi_func 의 인자로 전달하여 "다른곳"의 your_func 에 대입된다.. exec_func 실행될때 your_func 가 실행되는데 이것이 실제 실행되는 것은 "이곳"의 Function(1) 이 실행된 것이다.
주의사항.
- 위와같은 함수포인터 기반의 콜백구현시 "이곳"측의 함수는 클래스의 멤버함수를 전달하지 못하며, 클래스에서 static 함수만 전달가능한 단점이 있다.
static 함수이다 보니 함수내에서 클래스 멤버에 접근하지 못하여 불편한 경우가 자주 발생한다. static 함수내에서 클래스 멤버에 접근하지 않아도 되는 경우는 문제없이 사용가능하나, 범용적이지 못한 방법이라 콜백 구현하는 경우 위와 같은 함수 포인터 보다는 STL(Standard Template Library) 에서 제공하는 std::function, std::bind 를 이용하여 콜백구현하면 클래스 멤버 함수를 콜백함수로 구현가능하여 매우 편리하다.
STL 기반 콜백구현 상세설명 보기 -> http://igotit.tistory.com/213
연관
메타트레이더의 함수포인터 관련 문법은 상기 C 문법과 동일함.
상위정리
첫 등록 : 2015.01.11
최종 수정 : 2023.03.20
단축 주소 : https://igotit.tistory.com/212
'VisualStudio.C++.C# > C . C++' 카테고리의 다른 글
C++. 함수 인자로 포인터 전달하고 함수내에서 동적 메모리 할당 받기 2가지 방식. ** *& (1) | 2016.01.04 |
---|---|
C++. 파생 클래스에서 베이스 클래스의 인자 있는 생성자 실행되게 처리법 (1) | 2015.12.28 |
C++. 클래스 생성자 관련 기초 지식. - 디폴트 생성자/복사생성자/디폴트복사생성자/Shallow Copy/Deep Copy 등. (0) | 2015.12.28 |
2차원 이상 배열의 메모리 배치순서. (0) | 2015.01.17 |
STL std::function 기반 콜백함수 구현. (0) | 2015.01.11 |
댓글