学习WTL可以有多种方式,当然如果有COM和ATL的知识背景最好不过,如果你有MFC编程背景却最为糟糕,除非你对MFC无所不知、无所不能: -)(如果你不是MFC的ORACLE,那么最好忘却它)
对于一些技术点和平台作一定的介绍,以便于后续的学习。
5.1 UNREFERENCED_PARAMETER Macro
主要为消除M$ C++编译器在Level 4 (/W4)产生的C4100 :unreferenced formal parameter警告,但在/TC编译器选项下不可用。
消除C4100警告的还有另外一种常见的Unamed object的写法,如在 2.2 添加CWellcomeWindow.h中OnPaint(UINT /*uMsg*/...) ;这两种为消除C4100警告的写法,并无明显的优劣之分,且都是平台可移植的;但,从标准C++的编码规范来说,笔者更倾向于后者。
在M$ C++ Specification下还有其它的写法,但因其是M$ C++所特有,不便于学习标准C++,故在此不予考虑。
5.2 CXxx : public CYyy<CXxx>
此种声明在C++中是合法的,主要为实现编译时多态(Compile-time Polymophism)。
可参看如下代码:
//CXxxx declarations
#pragma once
#include "stdafx.h"
template <typename T>
class CYyy {
public:
void Wellcome(const char* s)
{
T* pT = static_cast<T*>(this);
pT->sayHello(s);
}
void sayHello(const char* s)
{
std::cout<<"Hi, "<<s<<std::endl;
}
};
class CXxx1 : public CYyy<CXxx1> {
};
class CXxx2 : public CYyy<CXxx2> {
public:
void sayHello(const char* s)
{
std::cout<<"Wellcome, "<<s<<std::endl;
}
};
// main entry point
int _tmain(int argc, _TCHAR* argv[])
{
CXxx1 x1;
CXxx2 x2;
x1.Wellcome("Joe");
x2.Wellcome("JoeM");
return 0;
}
以上代码中Cyyy ::Wellcome相当于一个多态函数的一个包装器(wrapper),而所有的秘密就在T* pT = static_cast<T*>(this) 语句;编译时多态在空间开销上至少比运行时多态节省一个vtable指针的空间开销,且因其在编译时就已决定了函数入口点,故具有更高的执行效率。
5.3 throw()
C++ 异常规范(Exception Specifications),用于函数声明之后,通知编译器此函数不会抛出异常;但在ATL中主要目的是使M$ C 的SEH (Structured Exception Handling)在ATL中具有可移植性。
在ATL中经常可以看到这样的代码,如在atlwin.h中Cwindow的声明中:
class CWindow
{
public:
static RECT rcDefault;
HWND m_hWnd;
CWindow(HWND hWnd = NULL) throw() :
m_hWnd(hWnd)
{
}
...
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1795230