본문 바로가기

C/C++

[펌] 비가상인터페이스(NVI) 패턴 스물한번째 이야기로 비가상인터페이스(Non-Virtual Interface; NVI) 패턴에 대해 소개드릴까 합니다. 보통 C++에서 자바의 인터페이스와 동일한 역할을 해주는 걸 추상 클래스라고들 말합니다. 추상 클래스를 정의할 때는 순수 가상 함수로 정의를 합니다. 그러니, 인터페이스를 정의할 때는 당연히 가상 메소드를 정의하게 되는데, 가상이 아닌 인터페이스를 정의한다는 게 말이 안되는 것 같지 않으세요 ? 예를 들어, 여러분이 이미지 디코딩 라이브러리를 개발하는데, 여러 가지 종류의 이미지를 지원하려고 이미지 디코더의 인터페이스를 제공한다고 상상해 보시죠. 그럼 당연히 다음과 같이 인터페이스를 정의하게 되지 않을까요 ? /// @file ImageDecoder.h class RGBImageBuffe.. 더보기
Singleton Pattern Singleton(싱클턴) Pattern 책의 Story 16 - ‘오직 하나뿐인 그대’의 내용을 토대로 재 작성한 것입니다. 프린터를 사용하려면 어떤 코드를 만드는 것이 좋을까요?시스템을 통틀어서 한대 밖에 없는 자원이니까 객체 역시 하나만 존재해야 합니다.먼저 떠오르는 건, 프린터를 전역(global) 변수로 사용하는 것입니다.그러나 전역 변수 사용은 흔히 나쁜 습관이라고 합니다. 아래와 같은 코드처럼 말이죠 먼저 선언을 하고,mainCPrinter* g_pPrinter;// 프린터객체는필요할때NULL 검사를한뒤생성해서사용하세요 int main(){ ...} 아래와 같이 사용할 수 있겠죠…CDocument.cpp / CImageViewer.cppvoid CDocument::Print(){ if (!g.. 더보기
union에서의 객체 사용 union에서의 객체 사용 표준 C++에서는 union에서 사용할 수 있는 객체에 제한이 있었나보다. [1] 아래와 같은 코드를 컴파일 했더니, struct Point { int _x; Point(); Point(int x):_x(x){};};typedef struct { CStr strUserInput; union { double dValue; bool bValue; int32 nValue; Point p; }value;}Prop;error C2620: member '::p' of union '::' has user-defined constructor or non-trivial default constructor위와 같은 에러가 난다. 사용자 정의 생성자나 non-trivial 기본 생성자를 사용하는 .. 더보기
[C++] 클래스에서 사용되는 static 멤버 변수 및 함수 클래스에서 사용되는 static 멤버 변수 및 함수 static 멤버 변수를 이해하기 위해서 먼저 알아야 하는 개념은 일반 static 변수이다.다음 코드는 함수 내에서 static을 선언하는 경우이다. 이 것이 우선 이해가 되어야 클래스에서 사용되는static을 이해할 수 있을 것이다. // 첫 번째 예제#include void func1( void ) { static int count = 0; printf( "%d \n", ++count ); } void main( void ) { func1(); // count = 9; , 컴파일 에러, func1()의 지역 변수에 접근이 불가능 func1(); } 위 코드를 실행하면 결과는 다음과 같다. count = 1 count = 2 위 코드를 설명하자면, .. 더보기
[visual studio]0xC0000005: Access violation Visual studio에서 access violation이 발생했는데,쓰레드에서 발생하는 경우 혹은 post message의 콜백을 통해 발생하는 경우Visual studio 디버깅이 종료되거나 혹은 쌩까고 지나가거나 .... 해당위치를 알려주지 않는다. 널 포인트일 경우처럼 디버깅 과정이 종료되면서 해당 위치를 알려주어야 디버깅을 할 수 있는데, 죽지 않으니 어디서 널포인트를 참조하는지 어떻게 확인을 할까... 즉, 아래와 같은 access violation 발생할 경우:First-chance exception at 0x06c4d726 (xxx.dll) in opera.exe: 0xC0000005: Access violation reading location 0x0000147c. visual stud.. 더보기
트리 탐색 (Iterative Tree Traversal) - 비 재귀 Iterative Tree Traversal Pre-order, Post-order, In-order 알고리즘실행 결과는 위키피디아의 트리 샘플을 참고(http://en.wikipedia.org/wiki/Tree_traversal#Example) Pre-order,1: s={}, visited={F}, s={B,G}2: s={G}, visited={F,B}, s={A,D,G}3: s={D,G}, visited={F,B,A}, s={D,G}4: s={G}, visited={F,B,A,D}, s={C,E,G}5: s={E,G}, visited={F,B,A,D,C}, s={E,G}6: s={G}, visited={F,B,A,D,C,E}, s={G}7: s={}, visited={F,B,A,D,C,E,G}, s.. 더보기
Window 깜빡임의 실체 - WM_ERASEBKGND와 WM_PAINT Window 깜빡임의 실체 - WM_ERASEBKGND와 WM_PAINT Window는 뭔가 새로 그려야할 필요성 있을 때마다 WM_PAINT Message를 받습니다. OnPaint라는 이름으로 WM_PAINT에 대한 Handler Function이 보통 만들어지죠. System으로부터 WM_PAINT가 날아오는 상황은 다음과 같습니다. - 윈도우가 처음 생성되었을 때 - 윈도우의 위치가 이동되었을 때 - 윈도우의 크기가 변경되었을 때(최소 및 최대화 포함) - 윈도우의 전체 또는 일부가 다른 윈도우에 가려져 있다가 나타날 때 - 윈도우가 스크롤 될 때 - UpdateWindow나 RedrawWindow 함수가 불렸을 때 - InvalidateRect나 InvalidateRgn 함수가 불려서 다시 그려.. 더보기
namespace Namespace 네임스페이스를 굳이 번역하자면 ‘이름 공간’으로,개체를 구분할 수 있는 범위를 나타내는 말로, 일반적으로 하나의 네임스페이스에서는 하나의 이름이 단 하나의 개체만을 가리킨다. [1] 쉽게 이해하기 위해, 코드를 보자면 아래와 같이 사용한다.namespace Box1{ int boxSide = 4;} namespace Box2{ int boxSide = 12;} int main () { cout 더보기
C6262 Excessive Stack Usage (스택 사이즈 초과 사용) C6262 Excessive Stack Usage (스택 사이즈 초과 사용) Visual Studio 11에서 빌드하다가 위와 같은 ‘경고’를 만났다디폴트 스택 사이즈는 16K Byte 인데, 이를 초과했을 경우 발생하는 경고이다.경고이긴 한데, 현재 진행 중인 프로젝트가 가끔 디버그에서 죽는 이유가 아닐까 싶어서 소스를 수정하기로 한다.디폴트로 세팅되어 있는 스택 사이즈는 16K Byte 이며, 이를 넘어설 경우 stack overflow exception이 발생할 수 있다. _resetstkoflw 함수를 사용하여 stack overflow 상태를 회복시켜, fatal exception error를 뱉으며 죽어가야 할 프로그램을 살리는 방법이 있긴 하나보다The _resetstkoflw functio.. 더보기
VIsual Studio의 /MP 옵션 (컴파일을 빠르게) VIsual Studio의 /MP 옵션 Visual Studio 2008부터(?) MP(Multiple Processes)옵션을 지원하는데,다수의 프로세스를 사용하여 컴파일을 하여 컴파일을 아주 빠르게 할 수 있다.아래는 [1]에서 퍼온 내용. /MP(여러 프로세스로 빌드)/MP 옵션은 명령줄에서 소스 파일을 컴파일하는 총 시간을 줄일 수 있습니다. /MP 옵션을 사용하면 컴파일러가 자체의 복사본 하나 이상을 각각 개별 프로세스로 만듭니다. 그런 다음 이러한 복사본에서 소스 파일을 동시에 컴파일합니다. 따라서 소스 파일을 빌드하는 총 시간이 상당히 줄 수 있습니다./MP[processMax] 인수processMax(선택적 요소) 컴파일러에서 만들 수 있는 최대 프로세스 수입니다.processMax 인수의.. 더보기