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.11std::string ReplaceAllSTL의 std::string를 이용하여 간단하게 문자열을 치환할 수 있다. 기본적으론 string.replace가 존재하며 해당 기능은 1번만 치환되므로 모든 문자를 치환하려면 추가로 작업을 해주어야 한다. 다음 코드를 보자 #include std::string replace_all( __in const std::string &message, __in const std::string &pattern, __in const std::string &replace ) { std::string result = message; std::string::size_type pos = 0; while ((pos = result.find(pattern)) != std::string:… -
[C/C++] 폴더 전체 경로 중 파일명만 가져오기
[C/C++] 폴더 전체 경로 중 파일명만 가져오기
2015.12.10Path 관련해선 MS에서 제공되는 다양한 API가 존재한다. 그 중 파일명을 가져오기위해서 직접 parsing을 해서 사용하다가 API를 찾게되었다. 바로 PathStripPath 라는 API 이다. Removes the path portion of a fully qualified path and file. 즉 전체 경로 중 실제 경로 부분만 제거한다는 의미이다. MSDN의 예제를 보면 TCHAR szPath1[] = TEXT("c:\\dir1\\file.txt"); PathStripPath(szPath1); // Result: szPath1 == file.txt TCHAR szPath2[] = TEXT("c:\\windows\\system32\\directx\\dinput\\joystick.ini")… -
관리자 권한으로 생성한 MMF User 권한으로 접근하기
관리자 권한으로 생성한 MMF User 권한으로 접근하기
2015.04.03 -
System Error Codes (0-499)
System Error Codes (0-499)
2015.03.30
댓글을 사용할 수 없습니다.