为wtl设计一个“文档-视图”模型

为wtl设计一个“文档-视图”模型

ID:17775270

大小:167.00 KB

页数:23页

时间:2018-09-05

为wtl设计一个“文档-视图”模型_第1页
为wtl设计一个“文档-视图”模型_第2页
为wtl设计一个“文档-视图”模型_第3页
为wtl设计一个“文档-视图”模型_第4页
为wtl设计一个“文档-视图”模型_第5页
资源描述:

《为wtl设计一个“文档-视图”模型》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、为WTL设计一个“文档-视图”模型作者:戴霖bill.dai@163.com前言21-编译期虚函数调用&嵌入类32-文档类43-视图类54-文档模板类65-文档模板管理器类66-上下文信息——CCREATECONTEXT67-改造你的代码78-模型的工作流程109-实现代码1110-后记22第23页共23页前言WTL(WindowsTemplateLibrary,Windows模板库)提供了比MFC库更加精减的代码框架,这其中就省略了对MFC“文档-视图”模型的支持。而“文档-视图”模型的核心思想——将数据和

2、其表示分开,在开发大型软件时颇为有用。那如何既能保留WTL精减方便的优点,又能拥有MFC“文档-视图”模型的精髓呢?本文将探讨一种方法,在为WTL引入“文档-视图”模型的同时,让其接口尽可能地接近于MFC,从而方便实际应用。我们将构建四个主要的类来实现“文档-视图”模型的行为,分别是文档类、视图类、文档模板类和文档模板管理器类。四部分的关系如下图:记录并管理一个或多个文档模板文档模板管理器文档模板文档视图记录并管理一个或多个文档;创建文档,同时负责创建所对应的视图(包括视图依附的框架);打开文档负责保存数据;

3、若数据有改变则更新所有关联的视图负责与用户交流,响应用户的操作;若用户的操作修改了数据则通知文档类由于WTL是构建在ATL基础之上的,所以其代码风格迥异于MFC,包含了大量的C++模板类代码。即使你能毫不费力地读懂它们,但是下面的代码仍然可能让你一头雾水:ClassCMyWin:publicCWindowImpl{……};这样做是合法的,虽然CMyWin类只是被部分定义,但是类名CMyWin已经被列入了C++的递归继承列表,是可以使用的。可是为什么要这样做呢?目的何在?这里蕴含了两个概念,一是

4、编译期间的虚函数调用机制,二是嵌入类。第23页共23页1-编译期虚函数调用&嵌入类如果你想了解它们如何工作,请看下面的例子;如果你已经有了很好的ATL基础,那么可以直接跳过本章。例子:templateclassBase{protected:voidSayHello(){cout<<"HelloBase";}public:voidPrint(){T*ptr=static_cast(this);//这里我们称之为编译期虚函数调用ptr->SayHello();}};classDeriver

5、1:publicBase{/*空类*/};classDeriver2:publicBase{protected:voidSayHello(){cout<<"HelloDeriver2";}};main(){Deriver1d1;Deriver2d2;d1.Print();//显示HelloBased2.Print();//显示HelloDeriver2}第23页共23页这句代码static_cast(this)就是窍门所在。它在函数调用时将指向Base类型的指针

6、this转换为指向派生类Deriver1或Deriver2的指针。因为模板代码是在编译期间生成的,所以只要编译器生成正确的继承列表,这种转换就是安全的。因为在这个例子里this只能是指向Deriver1或Deriver2类型的对象,不会是其他的东西。这很像C++的多态性,只是Print()方法不是虚函数。要解释这是如何工作的,首先看看对每个Print()函数的调用,在d1.Print()语句里,对象Base被指派为Deriver1,所以代码被解释成:voidBase::Print(){De

7、river1*ptr=static_cast(this);ptr->SayHello();}由于Deriver1没有重载SayHello(),所以查看基类Base,Base有SayHello(),所以Base的SayHello()被调用。再看d2.Print()语句,这一次对象被指派为Deriver2类型,Print()被解释成:voidBase::Print(){Deriver2*ptr=static_cast(this);ptr->SayHe

8、llo();}这一次,Deriver2含有SayHello()方法,所以Deriver2的SayHello()方法被调用。这种技术的好处在于:·不需要使用指向对象的指针。·不需要虚函数表,节省内存。·因为没有虚函数表,所以运行时不会发生调用了空指针指向的虚函数的错误。·所有的函数调用在编译时确定,而非C++虚函数机制使用的动态联编,这有利于编译程序对代码的优化。读到这里你应该可以明白什么是编译期间的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。