??xml version="1.0" encoding="utf-8" standalone="yes"?>
谨以此图BS自己的懒惰行为!呵呵Q?月䆾的想法到现在才完成。还好没有拖?7q去^_^?br />先把囄和代码给出,明天再把文字补上?br />
表示一个节点,它可以是一个数字,或者一个表辑ּQpExpq里我用的?a >boost?/a>的智能指针shared_ptrQ所以编译的话,需要先安装boost库)?br />q行的结果如图:
*输入Ӟ?e'表示输入l束?br />完整的代码和可执行文件点?a class="" title="" href="/Files/nj-blog/porland.rar" target="">q里下蝲。权当抛砖引玉了Q希望有更好法的同学赐教?br />
q是自Windows 1.0时代以来处理Windows消息使用最多的Q确实地Q它工作。但是问题是当你开始向你程序中加入更多复杂的特性,例如 MDIQOLEQ通用控gQ等{,你会获得一个行C千记的窗口函数。你开始反复用PageDn和PageUp键蟩跃,来寻找你需要修改的消息?br />LRESULT CALLBACK MainWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_COMMAND:
//
break;
case WM_KEYUP:
//
break;
case WM_CLOSE:
//
break;
case WM_DESTROY:
//
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
}
void myWnd_OnCommand (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
好了Q这些分器参数也同栯用于forwarding?-因此Q如你所期望的,我们之前调用SendMessage函数时展现的混ؕ可以减少了:快速浏览消息分器WizardҎ?br />FORWARD_WM_COMMAND (hwndParent, IDC_USERCTL,q种方式非常便,q且可以为所有消息分器Wizard支持的消息工作?br />
GetDlgItem(hwnd, ID_USERCTL), BN_DBLCLK, SendMessage);
使用消息分流Wizard工具
当你q行消息分流器WizardӞ你可以看C面的H口Q?br />
Wizard在左上角的列表框里ؓ你提供了WINDOWS.H里有的消息处理,你可以点M个或者多个消息。你可以在窗口ID~辑框里指定一个窗口标识,以指定你要发送消息的
H口。通用的ID?MainWnd QAbout (关于对话框)Q等{。这个标识会体现在消息处理函CQ和 HANDLE_MSG 宏中Q如果你刚刚开始编写代码,它还可以体现在窗
?对话框处理函C。?Make Window Procedure”选定框的作用是:允许你通过选定的消息分器的宏来生成一个窗?对话框函数的框架。以q种方式来开始一
个Windows API目Q你可以清晰的编写和l织你的代码Q当然还有,避免错误。在H口下面的两个编辑框会包含分器的宏和处理所选消息的函数Q只是原型)生成的代
码。要注意的是Q当你选择?span style="FONT-WEIGHT: bold">Make Window Procedure”时H口处理函数的模板代码不出现在这里:它仅体现在你点击了?span style="FONT-WEIGHT: bold">Copy Macro”时复制C的C++~辑器中
的代码里?br />
让我们通过例子来快速的览消息分流器Wizard工具的特性。记住你必须先通过#include <windowsx.h>头文g<windowsx.h>包含C.C/.CPP文g中?br />
<boost/checked_delete.hpp> 定义了两个函数模?/span> checked_delete ?/span> checked_array_delete Q?/span> q有两个cL?/span> checked_deleter ?/span> checked_array_deleter?/span>
当我们利用指针删除一个对象的时候,对象cd是否完整军_了对象是否能够被正确删除。但是,如果你用
delete
d除一个类型ƈ不完整的对象的指针,~译器ƈ不会l你提供M错误信息Q好吧,有些~译器会l出警告信息Q但是程序员通常会忽略警告信息)Q但是这样做的结果却是对象的析构函数Ҏ没有被调用?/span>
所以,我们应当使用更严厉的手段止q种事情的发生。比如说使用
checked_delete
代替
delete
来删除指针。当指针所指向的是一个不完全cdӞ
checked_delete
会ɾ~译器发出错误信息?/span>
checked_array_delete 是用来对应于 delete [ ] operator Q?/span> checked_deleter ?/span> checked_array_deleter 是可以配接的仿函数版本?/span>
3.
函数模板
next()
?/span>
prior()
包括
函数模板对传入的指针Q智能指针或是P代器做递增或递减Qƈ传回它。用法如下:
事实上, T next(T x) ?/span> T prior(T x) 分别调?/span> operator++ ?/span> operator-- Q?/span> T next(T x, Distance n) ?/span> T prior(T x, Distance n) 则调?/span> std::distance(T x, size_t n) ?
4.noncopyable c?/span>
如果你需要设计一个不可以被复制的c,那么你就要明地它的拷贝构造函数和
operator = ()
攑ֈ
private
声明下面?/span>
Boos\utility
准备了一个基c?/span>
noncopyable
Q你只需要让你的cȝ承自
noncopyable
可以获得这个性质。对你的cL说这也是一个显式的声明Q“我是不可以被复制的Q?/span>
用法Q?/span>
5
Q函数模?/span>
addressof()
函数模板q回一个对象的真实地址Q当然这是交l指针了Q:
首先?/span> Base-from-Member Q?/span>
有时你可能需要依赖成员变量来初始化基c,像这P
但是Q这?/span> fdostream 的构造函数的初始化是错误的,因ؓ c++ 语法要求基类的初始化要先于成员变量的初始化?/span> Base-from-Member 提供的解决之道如下: