1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <iostream> using namespace std; /** * 클라이언트 코드와 서버코드 * 서비스를 제공하는 코드측을 서버코드 * 그기능을 제공받는 코드측을 클라이언트코드 */ //서버// void PrintCall(){ cout<<"HelloWorld"<<endl; } //클라이언트// int main(){ PrintCall(); /** * 이처럼 클라이언트가 서버를 * 호출하게되면 Call * 반대로 서버가 클라이언트를 호출하게되면 * 콜백(CallBack) */ // 윈도우의 모든 프로시저는 시스템이 호출하는 Callback함수 system("Pause"); return 0; } |
서버에서 클라이언트 코드 호출 ( 콜백함수 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <iostream> using namespace std; //서버 코드영역// void PrintCall(){ cout<<"HelloWorld"<<endl; Client(); } //클라이언트 코드영역// void Client(){ cout<<"난 클라이언트"<<endl; } int main(){ PrintCall(); // 서버에서 클라이언트측 코드인 Client() 함수를 호출하면 // 이때 Client()함수를 '콜백함수'라 합니다. // 서버는 여러클라이언트에의해 호출되며 클라이언트의 존재를 알수없는데 // 위의 예제처럼 서버에서 클라이언트 코드를 알고 호출하는것을 불가능 // 합니다. 그래서 서버에게 알려줄필요가 있는데 // 그방법으론 함수포인터매개변수를 이용한 콜백함수의 주소를전달하는방법 // 객체,대리자,전략패터등을 사용 // 말그대로 서버는 구체적인 작업이 없이 클라이언트 함수의 의해서 작업 // 내용이 결정납니다. // 윈도우의 모든 프로시저는 시스템이 호출하는 Callback함수 system("Pause"); return 0; } |
// 함수포인터매개변수를 이용한 콜백함수의 주소를전달하는방법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <iostream> #include <algorithm> using namespace std; //서버 코드영역// void For_each(int *begin, int *end, void (*pf)(int) ){ while(begin != end){ pf(*begin++); // 클라이언트 함수 호출 콜백 } } //클라이언트 코드영역// void Print1(int n){ cout<< n << endl; } void Print2(int n){ cout<< n*n <<endl; } int main(){ int arr[5] = {10, 20, 30, 40, 50}; For_each(arr, arr+5, Print1); cout<<endl; for_each(arr, arr+5, Print2); /** * 서버코드는 단지 클라이언트함수를 처음부터끝까지 * 호출해주기만 한다. 추상화 * 출력정책은 클라이언트에서만 알고있고, 수정한다. */ system("Pause"); return 0; } |
'0x0001 > C, C++' 카테고리의 다른 글
[C++] Vector와 List의 차이점 (0) | 2019.02.08 |
---|---|
[C++] 함수객체 ( Functor ) (0) | 2019.02.08 |
[C++] 정적함수포인터, 멤버함수포인터 (0) | 2019.02.08 |
[C++] 템플릿 (함수템플릿, 클래스템플릿) (0) | 2019.02.08 |
[C++] 연산자 오버로딩 (0) | 2019.02.08 |