C++에서 C#의 Delegate 사용
// Callback의 개념.
class Car
{
typedef void(*SIGNAL)();
SIGNAL signal;
public:
Car(SIGNAL s = 0) : signal(s) { }
void SpeedUp( int speed )
{
cout << "Speed : " << speed << endl;
if( speed > 100 && signal != 0 )
signal(); // 외부에알린다.
}
};
void Police()
{
cout << "Police Start.." << endl;
}
void main()
{
Car c(Police);
c.SpeedUp(100);
c.SpeedUp(200);
}
/////////////////////////////////////////////////////////////
// 1. callback을 담당 할 클래스를 만들자. - 함수포인터를 관리하는 객체
class delegate
{
typedef void(*SIGNAL)();
SIGNAL signal;
vector<delegate*> del_list;
public:
delegate( SIGNAL s ) : signal(s) {}
void Add( delegate* p ) { del_list.push_back( p ); }
void Remove( delegate* p ) { }
void Invoke()
{
if( signal != 0 ) signal();
for( int i = 0; i < del_list.size(); ++i )
del_list[i]->Invoke();
}
// 연산자 재정의
delegate* operator+=(delegate* p)
{
Add(p);
return this;
}
void operator()()
{
Invoke();
}
};
//----------------------------------------------------------
void foo() { cout << "foo" << endl; }
void main()
{
delegate d1(foo);
delegate d2(foo);
delegate d3(foo);
d3 += new delegate(foo);
d3.Add( new delegate(foo) );
d2 += &d3;
d1.Add( &d2 );
d1.Invoke();
cout << endl;
d1();
}
/////////////////////////////////////////////////////////////////
// 2. callback을 담당 할 클래스를 만들자. - 함수포인터를 관리하는 객체
class delegate
{
typedef void(*SIGNAL)();
SIGNAL signal;
vector<delegate*> del_list;
public:
delegate( SIGNAL s ) : signal(s) {}
void Add( delegate* p ) { del_list.push_back( p ); }
void Remove( delegate* p ) { }
void Invoke()
{
if( signal != 0 ) signal();
for( int i = 0; i < del_list.size(); ++i )
del_list[i]->Invoke();
}
// 연산자재정의
delegate* operator+=(delegate* p)
{
Add(p);
return this;
}
void operator()()
{
Invoke();
}
};
//----------------------------------------------------------
class Car
{
public:
delegate del;
public:
Car() : del(0) { }
void SpeedUp( int speed )
{
cout << "Speed : " << speed << endl;
if( speed > 100 /*&& del != 0*/ )
del(); // 외부에알린다.
}
};
void Police()
{
cout << "Police Start.." << endl;
}
void main()
{
Car c;
c.del += new delegate(Police);
c.del += new delegate(Police);
c.SpeedUp(100);
c.SpeedUp(200);
}
'⌨ DEVELOPMENT > C++' 카테고리의 다른 글
__cdecl, __stdcall, __fastcall x86 호출 규약(Calling Convention) (4) | 2016.01.01 |
---|---|
[C/C++] FormatMessage 윈도우 GetLastError를 메시지로!! (0) | 2015.12.29 |
[C/C++] IPC - Pipe client simple example (0) | 2015.12.28 |
[C/C++] IPC - Pipe server simple example (1) | 2015.12.21 |
[C/C++] string replace all 문자열 모두 치환 (0) | 2015.12.11 |
[C/C++] 폴더 전체 경로 중 파일명만 가져오기 (0) | 2015.12.10 |
관리자 권한으로 생성한 MMF User 권한으로 접근하기 (0) | 2015.04.03 |
System Error Codes (0-499) (0) | 2015.03.30 |
댓글
이 글 공유하기
다른 글
-
[C/C++] string replace all 문자열 모두 치환
[C/C++] string replace all 문자열 모두 치환
2015.12.11 -
[C/C++] 폴더 전체 경로 중 파일명만 가져오기
[C/C++] 폴더 전체 경로 중 파일명만 가져오기
2015.12.10 -
관리자 권한으로 생성한 MMF User 권한으로 접근하기
관리자 권한으로 생성한 MMF User 권한으로 접근하기
2015.04.03 -
System Error Codes (0-499)
System Error Codes (0-499)
2015.03.30