2. WTL 이란..
• 윈도우즈 응용프로그램을 만드는데 사용
• 윈도우즈 응용프로그램을 만드는데 크게 2가지 방법이 있음
• C 수준에서 직접 API 함수를 호출해서 만드는 SDK 방법
• C++로 API를 클래스화 하여 사용하는 MFC 방법
• SDK는 빠르지만 생산성이 낮고 MFC는 느리지만 생산성이 좋다
• 이 둘의 장점을 합친것이 WTL임
3. 버려진 WTL?
• 애초에 마소에서 공식 지원하지 않음..
• Win32와 뭐가 다른거지..
• Win32에 비해 마법사, 메시지 맵 편집 등 일부 기능이 자동화되어 있다.
• 자료가 없음..
• 이도저도 아님..
• 마소에서도 자기들이 쓰려고 만든 것..
4. WTL은 가벼워야한다
• 내부적으로 상속을 엄청 많이 받는다
• 메인 프래임, UI 갱신, 메시지 필터링 등등을 위한 클래스를 다
중상속한다.
class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>,
public CMessageFilter, public CIdleHandler
{
public:
DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)
CWTLFirstView m_view;
....
BEGIN_MSG_MAP(CMainFrame)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
....
END_MSG_MAP()
....
};
5. 그래서..
• 템플릿을 이용한 가상 함수 구현
• class CWTLFirstView : public CWindowImpl<CWTLFirstView>
• 그냥 상속을 받는 것이 아니라 기반 클래스를 상속받고, 자기 자
신을 템플릿 인수로 넘겨준다
• class Child : public Parent<Child>
6. 일반적인 상속
#include <stdio.h>
class Dog
{
public:
virtual void Bark() { printf("mung mungrn"); }
};
class MadDog : public Dog
{
public:
virtual void Bark() { printf("yaong yaongrn"); }
};
void KickDog(Dog *pDog)
{
pDog->Bark();
}
void main()
{
Dog Happy;
MadDog DdangChil;
KickDog(&Happy);
KickDog(&DdangChil);
}
7. WTL의 상속?
#include <stdio.h>
template <typename T> class DogBase
{
public:
void KickDog()
{
T* pDog=(T *)this;
pDog->Bark();
}
};
class Dog : public DogBase<Dog>
{
public:
void Bark() { printf("mung mungrn"); }
};
class MadDog : public DogBase<MadDog>
{
public:
void Bark() { printf("yaong yaongrn"); }
};
void main()
{
Dog Happy;
MadDog DdangChil;
Happy.KickDog();
DdangChil.KickDog();
}
8. 왜 이럴까..
• 효과는 거의 동일하다
• 가상함수를 사용하는것고 동일하다
• 장점이 있겠지
• 멤버 함수 호출에 객체를 직접 사용하므로 포인터 사용할 필요가 없음
• 그래서 NULL 포인터 호출이 없음
• 가상 함수를 위한 vtable을 만들지 않아도 됨
• 가상 함수 테이블은 포인터를 저장하므로 용량이 크지는 않지만, 다중
상속을 겹겹이 해대고 가벼워야 하는 목적을 둘 다 달성하기 위해 사용
됨
9. 믹스인 클래스
#include <stdio.h>
#include <windows.h>
template <typename T> class Sentinel
{
public:
void OnThief()
{
T* pDog=(T *)this;
for (int i=0;i<5;i++) {
pDog->Bark();
printf("왔다리 갔다리...rn");
Sleep(500);
}
}
};
class Dog : public Sentinel<Dog>
{
public:
void Bark() { printf("mung mungrn"); }
};
class Cow : public Sentinel<Cow>
{
public:
void Bark() { printf("ume umern"); }
};
void main()
{
Dog Happy;
Happy.OnThief();
Cow So;
So.OnThief();
}