응용 프로그램을 제대로 시작하지 못했습니다(0xc0150002)
이 에러는 Microsoft Visual C++ 2005 (Redistributable) 재배포 가능 패키지 (x86) 가 설치되지 않았을 때 발생하는 에러이다
다음 사이트에 들어가서 다운 받아 설치한다
https://www.microsoft.com/ko-kr/download/details.aspx?id=26347
원본 사이트 : http://www.tutok.sk/fastgl/callback.html
* 원 제목 : Callbacks in C++ using template functors
- 도입(Introduction)
객체 지향 프로그래밍의 많은 약속 중에 하나는 재사용 가능한 컴포넌트와 함께 플러그 앤 플레이 소프트웨어 디자인을 허락하는 것이다.
디자이너는 그들의 라이브러리 덩어리로부터 객체를 땡겨올 것이고, 그것들을 가지고 소프트웨어를 함께 만들이 위해 연결할 것이다
C++에서 컴포넌트들과 함께 하는 이 연결은 난감할 수 있고 특히 만약 그것들이 별도로 디자인 되어있으면 더 난감하다
우리는 여전히 상호 작용하는 라이브러리와 응용 프로그램 컴포넌트들로부터 긴 길이 될 것이다
콜백은 독립적으로 개발된 객체들이 함께 연결될 수 있는 메커니즘을 제공한다
그것들은 플러그 앤 플래이 프로그래밍에 필수적인데, 왜냐하면 공장 B의 클래스, 또는 너의 집에서 끓인 클래스의 용어로 그들의 라이브러리를 구현하는 공장 A의 가능성은 0이기 때문이다
콜백은 널리 사용되지만 일반성의 부족으로 최소한이 현재 구현은 다르고 대부분 부족으로부터 고통을 받는다
이 글은 콜백이 무엇이고, 어떻게 그것들이 사용되고, 좋은 콜백 메커니즘에 대한 기준을 설명한다
그것은 현재의 콜백 메서드와 그것들의 약점을 요약한다.
그리고나서 그것은 템플릿 함수자(template functor)- 함수처럼 행동하는 객체-에 기반한 유연한, 파워풀한, 사용하기 쉬운 콜백 기술을 설명한다
* 콜백의 근본(Fundamentals)
- 콜백이란 무엇인가?
응용프로그램 또는 서브 시스템에 특화된 컴포넌트들을 디자인할 때 우리는 종종 어느 컴포넌트끼리 상호작용할지 클래스의 모든 것을 알고 따라서
명시적으로 이 클래스들로 인터페이스를 코딩한다
그러나 일반적인 목적 또는 라이브러리 컴포넌트를 디자인할 때, 그것은 종종 필수적이거나 모르는 객체를 호출할 때 같이 하기 위해 넣기를 원한다
요구되는 것은 다른 컴포넌트 타임의 용어나 지식으로 쓰여지는 것에 관계 없이 서로를 호출하는 하나의 컴포넌트를 위한 방법이다
그런 '타입 블라인드' 호출 메커니즘을 종종 콜백으로 언급한다
콜백은 아마 간단한 통보, 두가지 의사소통 또는 프로세스에서 일을 분배할 때 사용된다
예를 들어 응용 프로그램 개발자가 클릭할 때 GUI 라이브러리 호출을 응용 프로그램에 특화된 객체로 Button 컴포넌트를 갖기를 원한다
데이터 진입 컴포넌트의 디자이너는 입력 유효성을 위한 응용 프로그램 객체 호출을 위한 능력을 제공하기를 원할 수도 있다
Collection 클래스들은 종종 apply() 함수를 제공하는데, 이것은 그것들이 포함하는 아이템에 대한 응용 프로그램 객체의 멤버 함수를 적용한다
그리고나서 콜백은 응용 프로그램 객체와 함께 상호작용으로 세우기 위해 개발자들이 사용할 수도 있는 일반적인 연결점을 제공하는 컴포넌트 디자이너들을 위한 방법이다
일부 연속적인 점에서 컴포넌트는 응용 프로그램 객체를 콜백한다
의사소통은 함수 호출의 형태를 갖는다 왜냐하면 이것은 C++에서 객체들이 상호작용하는 방법이기 때문이다
콜백은 많은 문맥에서 유용하다
만약 당신이 상용 클래스 라이브러리를 사용한다면 아마도 콜백을 제공하는 최소한 하나의 메커니즘을 봤을 것이다
모든 콜백 구현은 C++ 타입 시스템에 의해 제공된 근본 문제를 다루어야 한다
그러나 당신은 컴포넌트가 디자인 됐을 때 그것의 타입을 모르는 객체들의 멤버 함수들을 호출할 수 있는 컴포넌트들을 빌드할 수 있는가?
C++ 타입 시스템은 우리가 호출하기를 원하는 멤버 함수의 어떤 객체의 타입을 알기를 원하고 종종 진짜 컴포넌트 기반 디자인을 지지하는 것에 매우 유연한 다른 언어들의 팬에 의해 비판 받는다
왜냐하면 모든 컴포넌트들은 서로에 대해 알아야만 하기 때문이다
C++의 강한 타입은 많은 장점들을 금지시키지만 이 유연성의 분명한 부족함을 다루는 것은 강건하고 상호작용하는 클래스 라이브러리들의 확산을 격려할 수도 있다
C++은 사실 매우 유연하고 그 메커니즘은 언어의 확장 없이 이 기능을 제공하는 유연함의 지렛대를 여기에서 나타낸다
특히 템플릿은 이와 같은 문제를 풀기 위한 강력한 도구를 제공한다
만약 당신이 템플릿이 오직 컨테이너 클래스를 위한 것이라고 생각했다면
이 글을 읽어라~
* 콜백 용어(Callback Terminology)
콜백 메커니즘에서 3가지 요소가 있다
- 호출자(caller), 콜백 함수(callback function), 피호출자(callee)
* 윈도우
- 프로그램이 출력 결과를 내 보내고 사용자로부터 입력을 받아들이는 화면 상의
사각 영역
* 윈도우의 특징
1. 윈도우는 일단 화면상에 존재
메모리에만 존재하는 것이 아니라 화면 상에 나타나며 사용자의 눈에 보인다
2. 그 모양은 반드시 직사각형
화면상의 좌상단 좌표를 가지고 높이와 폭이 있음
3. 윈도우는 독립적으로 사용자와 상호작용을 할 수 있음
입력된 명령과 신호를 처리하는 메시지 처리 능력이 있음
* 윈도우 클래스
- 모든 윈도우들은 윈도우 클래스로부터 만들어진다
- 윈도우를 만들기 위한 형틀(template)이며 생성될 윈도우의 여러 가지 특징들을 모아놓은 구조체
* 윈도우 클래스의 종료
1. 시스템 전역 클래스
2. 응용 프로그램 전역 클래스
3. 응용 프로그램 로컬 클래스
* 포인터를 사용한 방법의 장점
- 포인터가 인덱스 표기법보다 빠르다
- 이유는 원소의 주소를 계산할 필요가 없다
ex) sum += a[i];
sum += *a++;
- 디지털 이미지는 배열을 사용하여 저장된다
- 이미지 처리를 할 때 속도를 빠르게 하기 위하여 포인터를 사용한다
void brighten_image(char image[][size])
{
}
* 포인터를 이용하지 않는 버전도 작성
- 배열의 인덱스 표기법으로 위의 프로그램을 변환
- 배열의 이름에 다른 변수의 주소를 대입
- 포인터를 이용하여 배열의 원소들을 참조
- 포인터를 배열의 이름처럼 사용
* 이중 포인터
- 포인터를 가리키는 포인터
int i = 10;
int* p = &i;
int** q = &p;
* 포인터 배열
- 포인터 배열 : 포인터를 모아서 배열로 만든 것
int* ap[10];
1. [] 연산자가 * 연산자보다 우선 순위가 높으므로 ap는 먼저 배열이 된다
2. 어떤 배열이냐 하면 int*(포인터) 들의 배열이 된다
* 2차원 배열에 문자열을 저장
char fruit[4][10]
= { "apple", "blueberry", "orange", "melon"};
* 문자형 포인터 배열
char* fruit[]
= { "apple", "blueberry", "orange", "melon"};
* 배열 포인터
- 배열을 가리키는 포인터
int (*pa)[10];
1. 괄호가 먼저 있으므로 pa는 포인터가 된다
2. 어떤 포인터냐 하면 int [10]을 가리키는 포인터이다.
int a[5] = {1, 2, 3, 4, 5};
int (*pa)[5];;
pa = &a;
std::cout << (*pa)[2] << std::endl;
int arr[10];
int *parr;
int (*parr2)[10];
parr = arr;
parr2 = &arr;
arr[3] = 20;
std::cout << parr[3] << std::endl;
std::cout << (*parr2)[3] << std::endl;