본문 바로가기

C++

C++ 콜백함수

콜백함수 란

프로그래밍에서 콜백(callback) 또는 콜애프터 함수(call-after function)[1]는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있다.

ko.wikipedia.org/wiki/%EC%BD%9C%EB%B0%B1

 

콜백 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 프로그래밍에서 콜백(callback) 또는 콜애프터 함수(call-after function)[1]는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이

ko.wikipedia.org

콜백함수를 이용하여 함수포인터와 횟수를던져주면해당 횟수만큼 함수를 실행하는 콜백함수를 구현해보았다.

설명은 주석으로 대체

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 
#include <iostream>
using namespace std;
#include <list>
 
class Event 
{
public:
    int duration; // 소요 시간
    int elapse; // 경과 시간
 
    virtual void Update() = 0;
    bool IsDone()
    {
        return elapse >= duration;
    }
};
 
// 모든 이벤트를 실행시켜줄것이다.
class CallFunc;
class EventManager
{
public:
    std::list<Event*> _events; // 모은 이벤트를 저장
public:
    void Instance(CallFunc* func) // 이벤트를 넣어줄 함수
    {
        _events.emplace_back(func);
    }
 
    void Update()
    {
        for (std::list<Event*>::iterator it = _events.begin(); it != _events.end(); )
        {
            (*it)->Update();
            if ((*it)->IsDone()) // 횟수가 지정한 횟수랑같아지면 이벤트를 삭제한다.
            {
                _events.erase(it++);   
            }
        }
    }
};
 
// 동작하는 이벤트
class CallFunc : public Event
{
public:
    void (*_func)(); // 함수포인터를 맴버변수로 가진다.
public:
    CallFunc(void (*func)(), int _duration);
 
    virtual void Update() override
    {
        _func();
        elapse += 1;
        return;
    }
};
 
CallFunc::CallFunc(void (*func)(), int _duration) {
    _func = func; // 매개변수로 넘어온 함수를 저장한다.
    duration = _duration; // duration은 0으로 설정한다.
}
 
 
void AAA()
{
    cout << "Hello World" << endl;
}
 
void BBB()
{
    cout << "Hello View" << endl;
}
 
void CCC()
{
    cout << "Hello Matrix" << endl;
}
 
int main()
{
    EventManager* mgr = new EventManager();
    mgr->Instance(new CallFunc(AAA, 3));
    mgr->Instance(new CallFunc(BBB, 1));
    mgr->Instance(new CallFunc(CCC, 2));
 
    for (int i = 0; i < 100; i++)
    {
        mgr->Update();
    }
    return 0;
}
cs


 

 

'C++' 카테고리의 다른 글

C++ Dll생성 및 사용  (0) 2021.01.26
C++ Static Library ,DLL(Dynamic Linking Library)  (0) 2021.01.23
C++ STL(Map)  (0) 2020.10.06
C++ STL(알고리즘)  (0) 2020.09.28
C++ STL(반복자 iterator)  (0) 2020.09.28