가끔 생각해 보면 참 바보 같다는 생각이 든다. 기존의 작업 스탈을 보면 ListCtrl의 하나하나의 열에 해당 포인터 변수를 추가해서 사용하게 되는 경우가 많은데, 이때 포인터 변수이기 때문에 메모리를 소거해야 하는 부담감에 휩싸이게 된다. 하지만 난 이제까지 몰랐던것이다.. -.-;
ListCtrl의 흐름 자체를 말이다.
삭제를 할때 나는 해당 아이템을 DeleteItem(i); 이런식으로 하기 전에 사용자 데이터를 지워주어야 하는줄 알았다. 하지만 이 작업은 중간 중간 수정을 하거나 모두 지우거나 추가 하면서 몇가지 부수적인 작업패턴을 부적절하게 발생 시키게 된다.
하지만 이것은 아래의 함수에서 DeleteItem(), DeleteAllItem()을 할때 매번 호출 되는 오버라이드 함수가 있었다는 사실을 알게 되었다.
즉, ON_NOTIFY(LVN_DELETEITEM, IDC_LIST_IMAGELIST, OnLvnDeleteitemListImagelist) 이 함수를 오버라이딩 해서 사용하게 되면 해당 아이템이 지워질때 이 함수가 호출 되게 된다. 다시 말해서 이 함수 안에서 해당 하는 아이템만 지워 주면 다른건 신경 쓰지 않아도 되는 것이다.
그렇다면 모두 지우는 과정에서는 어떻게 되는가 하고 모르는 분들이라면 질문을 할텐데요. 위의 함수가 그 개수만큼 호출 됩니다.
CATCH_ALL(error) { AfxMessageBox ("서버로부터 파일 크기를 얻어오는 과정에서 에러발생"); error->GetErrorMessage(szCause,254,NULL); CauseOfError.Format("%s",szCause); AfxMessageBox (CauseOfError); } END_CATCH_ALL;
웹의 경로에 위치한 이미지를 가져오는 모듈입니다. 원래 이미지 사이즈를 구하기 위해서 사용했던건데요. 파일 다운로드 쪽으로 활용해도 가능성이 있을듯 하네요.
try { byte[] data = new System.Net.WebClient().DownloadData(url); System.IO.MemoryStream ms = new System.IO.MemoryStream(data); Image img = Image.FromStream(ms);
Size size = new Size(img.Width, img.Height); return size; } catch(Exception ex) { return new Size(-1, -1); }
// IRefCountImpl // IRefCount의 표준적인 구현 // 이것을 상속하기만 하면 참조 횟수 관리 기능이 생긴다. // class CMyObject : public IrefCountImpl<CMyObjct> { ... }; // 주의: 개별 클래스가 IRefCount를 꼭 구현할 필요는 없지만, // 직접 구현함으로써 메모리 단편화를 줄일 수도 있다.
template <class T> class IRefCountImpl : public IRefCount<T> { private: int m_Count;
template <class T> class SmartPtr { private: IRefCount<T> *m_RefCount; // RefCounter // IRefCount를 직접 구현하지 않는 클래스를 위한 내부구현. // SmartPtr은 이 내부 구현과 클래스 T의 IRefCount 구현중 // 적절한 것ㅇ르 자동적으로 선택한다.
class RefCounter : public IRefCountImpl<T> { private: T *m_Ptr; protected: virtual T* GetPtr() const { return m_Ptr; } virtual void Destroy() { delete this; }
GamePlayer 클래스와 GameLevel 및 그 하위 클래스들은 모두 동일한 인터페이스를 가지고 있는데, 이는 GamePlayer 객체에 각기 다른 유형의 공격 요청이 주어졌을 때 이에 대한 처리를 GameLevel 및 그 하위 클래스에게 위임시키기 위한 것이다. 이때 GamePlayer 객체가 공격 요청을 위임시키기 위한 방법으로는 내부적으로 관리하고 있는 GameLevel 포인터 객체를 통해 다형성(Polymorphism)을 적용시키는 것이다.
추가된 상태를 포함해서 객체의 상태 변화 시 기존 소스코드 변경없이 행위 수행 변경이 가능하도록 객체 상태 정보를 클래스 상속 구조로 정의해서 사용하는 방식을 State 패턴이라고 한다.
#include "stdafx.h"
#include <iostream> #include <string> using namespace std;
////////////////////////////////////////////////////////////////////////// class ClockTime : public Subject { public: ClockTime() {}
virtual int GetHour() { return 0; } virtual int GetMinute() { return 0; } virtual int GetSecond() { return 0; }
void Tick(); };
void ClockTime::Tick() { Notify(); }
////////////////////////////////////////////////////////////////////////// class Output { public: Output() {} virtual ~Output() {}
void Draw() { printf("Output....\n"); } };
////////////////////////////////////////////////////////////////////////// class DigitalClock : public Output, public Observer { public: DigitalClock(ClockTime*); virtual ~DigitalClock();