본문 바로가기

개발/C/C++

(10)
[C/C++]자주 하는 실수 프로그램을 하다 스스로 자주 실수하게 되는 코딩 스타일이 있습니다. 얼마전에 제가 자주 겪는 함정에 빠졌는데요. 관련 코드를 축약하면 아래와 같습니다. CMyClass* pMy = NULL; // 클래스 생성을 함수를 통해 대행 CreateMyClass(pMy); // 아래 함수 호출하면 Crash!! pMy->DoSomeghing(); // 잘못 만들어 진 함수 void CreateMyClass(CMyClass* pMy);) { pMy = new CMyClass; ASSERT(pMy); } CreateMyClass() 라는 함수를 통해 CMyClass 의 생성을 대행하는 것이 목적이었는데, 주석으로 보이는 것과 같이 프로그램이 쉽게 죽어버렸습니다. 이상하게, 포인터를 가지고 작업하다 보면 이와 같은 실..
[C++]소멸자에서 가상함수 호출하기 소멸자에서 가상함수 호출하기 시도 요즘은 거의 코딩할일이 없다보니 블로그에 개발 관련 글을 포스팅할 기회조차 없네요 개발자라는 타이틀은 이제 빼야 할 때가 왔나 봅니다. ㅎㅎ 지난번 포스팅에서 간단하게 포인터를 Wrapping 하는 템플릿을 소개한적이 있습니다. [C++]포인터 Wrapping 클래스 만들기 나름 쓸모 있어서 요긴하게 사용하고 있는데요. 사용을 하다 보니 이 템플릿의 변종들이 필요하게 되었습니다. 지난번에 만든 포인트를 감싸는 템플릿 코드는 아래와 같습니다. template class IMyAutoPtr { public: IMyAutoPtr(){m_pPtr = NULL;} ~IMyAutoPtr() { if (m_pPtr) m_pPtr->Release(); m_pPtr = NULL; } T..
[C++]포인터 Wrapping 클래스 만들기 요즘 회사 내에서 기존에 만들어진 컨트롤들을 새로 만들어 진 컨트롤로 변경하는 작업을 계속 진행 중입니다. 새로 만들어진 콘트롤들은 인터페이스 기반으로 만들어 져 있고 인터페이스는 조금씩 틀리지만 대부분 아래와 같은 선언과 생성, 리소스 반환 방식을 채택하고 있습니다. 1. 선언 IXXControlA* m_pControl; 2. 생성 m_pControl = NULL; m_pControl = GetControlA(); 3. 종료 함수 if (m_pControl) m_pControl->Release(); 와 같은 방식으로 사용하고 있습니다. 컨트롤들의 종료는 수십 가지이지만, 컨트롤을 생성하는 방식과, 모두 다 사용한 후 리소스를 반환하는 방식(->Release() 호출) 은 모두 동일합니다. 새로 만들어진..
[C/C++] enum, 보다 나은 enum #define 과 얼핏 비슷해 보이지만, 비슷한 유형별의 데이터를 표현하기 위해 반드시 필요한 C++의 필수 타입인 enum 의 몇 가지 재미있고 유용한 팁을 소개합니다. 1. namespace 와 결합하기 일반적으로 enum 을 이용하여 타입이름을 짓기란 쉬운 일이 아닙니다. 만약 리스트에 필요한 정렬 기준을 enum 으로 표현한다면 아래 정도가 됩니다. enum SORT_LIST{ SORT_DATE, // 날짜순 SORT_NAME, // 이름 SORT_CONTENT, // 내용 S0RT_ETC, // 기타}; bool SortSomeData(SORT_LIST SortList){ switch (SortList) { case SORT_DATE: break; case S0RT_NAME: break; // ..
싱글톤 클래스 어플리케이션을 개발하다 보면 어플리케이션 전역으로 쓰이는 필수 클래스가 있게 마련입니다. 이런 클래스들은 그 특성상 하나의 인스턴스만 생성되어야 하고, 시스템 전역에서 사용하다 보니 이 클래스의 코드 수정으로 인한 시스템에 걸쳐 있는 다른 프로그램들의 수정이 최소화되도록 설계되는 게 보통입니다. 하나의 인스턴스만 생성되어야 하는 클래스를 보통 싱글톤 클래스라고 부르는데요, 요즘은 패턴관련 책들이 워낙 많아 싱글톤 패턴들은 이미 머리 속에 콕 하고 들어 있을 겁니다. 싱글톤 클래스를 만드는 방법 중에 제가 자주(늘~) 사용하는 방법은 패턴 책에 구현된 코드가 아닌 “More Effective C++” 책에 소개된 방법입니다. class Printer { public: void SubmitPrint(); ...
[C++]STL Container 조합하기 STL 에서 하나의 Container를 선택하는 방법은 간단합니다. vector – 맨 뒤에만 추가할 경우 순차 검색에 유리 dequeue – 앞 뒤로 추가할 경우 및 순차 검색에 유리 map – 검색이 필요할 경우 유리 list – 데이터의 삽입과 삭제가 빈번할 경우 유리 … 와 같은 식으로 간단하게 선택할 수 있습니다. 하지만, 가끔가다 보면 위에 Container 의 특징을 하나 이상 만족해야 할 경우가 있습니다. 특히 검색도 빨라야 하면서, 초기에 주어진 순서를 그대로 유지해야 하는 경우가 그렇습니다.간단하게 생각하면 map 와 vector 를 같이 사용하면 되지 않나 싶은데요 몇 가지 고려해야 할 경우가 있습니다. 우선 설명을 더 진행하기 전에 예제에서 사용할 간단한 더미 구조체를 하나 선언하겠..
[C/C++]유용한 #pragma directive ※ 주의 : 아래에서 기술하는 내용은 Visual C++ 컴파일러에서만 확인된 내용입니다. 지난번 #define 팁 에 이어 이번에는 필수는 아니지만 사용할 경우 아주 편리한 #pragma 지시자를 간단하게 소개하려고 합니다. 1. 헤더 파일을 한번만 읽어 들이기 아마도 이 경우가 #pragma를 가장 널리 사용하게 된 이유 중에 하나라고 생각되는데요 저도 언제나 헤더 파일을 새로 코딩 할 때 이 한 줄을 먼저 적게 됩니다. (아주 짧고 멋집니다) #pragma once #pragma once 가 없을 당시에는 아래와 같이 헤더 파일 내용을 #ifndef ~ #endif 문장을 사용해서 복잡하게 써주어야 했습니다. (요 복잡한 게 한 줄로 줄었으니 사용하지 않을 수 없죠^^) #ifndef _MY_HEA..
[C++]인터페이스를 이용하여 상호참조와 종속성을 최소화하는 방법 이번 글의 주제는 C++ 에서 호출하는 클래스(CCaller) 와 호출 받는 클래스(CCallee) 가 있을 경우 호출 받는 클래스(CCallee)에서 이벤트가 발생 등의 이유로 호출하는 클래스(CCaller)의 어떤 함수를 호출하고자 할 경우 사용할 수 있는 안전한 방법에 대해 얘기하고자 합니다. 일반적인 함수호출은 아래 그림과 같습니다. 오늘 설명 드리고자 하는 내용은 반대로 CCallee 클래스에서 CCaller 클래스의 Method를 종속성을 해하지 않고 호출하는 방법을 알아 보려고 합니다. 설명을 진행하기 위해 간단하게 CCaller 와 CCallee 를 만들었습니다. CCaller 는 CallSerice() 멤버 함수에서 CCallee 의 인스턴스를 만들고 CCallee::DoSomething..