以下总结的内容基本上来自于NS2笔记 之 OTcl与C++ 和[译] NS2中OTcl 和C++ 的连接 (一),没有基础可以先看下这两篇文章。
首先我们要清楚在NS2的设计中,连接tcl和c++架构的是TclCl类,这个TclCl类,包括六种主要的类,Tcl、TclObject、TclClass、InstVar、TclCommand 、EmbeddedTcl。他们都是c++代码。主要作用如下:
1 Tcl 类:提供从编译体系访问解释体系的方法(Method).
2 InstVar 类:负责把两种体系中的成员函数对应的绑定。
3 TclObject 类:是编译体系中所有C++模拟对象的基类。
4 TclClass 类:将解释体系中的类名一一对应于编译体系中的对应类名。
5 TclCommand 类:提供从解释体系访问编译体系的全局方法。
6 EmbeddedTcl 类:把OTcl 脚本转化为C++代码。
这一节我们主要关注的是TclClass和TclObject。
将分裂模型讲的比较好的是[译]NS2中OTcl类和C++类的连接(三) ,尤其是里边的几个函数、类的调用流程图,很清晰明了。
因为NS2中的分裂模型机制,我们如果想定义一个c++中的TclObject类,同时想在NS的用户接口中用tcl脚本使用,必须为这个tclObject建立一个影子octl类,建立这种映射关系是通过TclClass类来完成。因为TclClass是一个纯虚类,所以我们需要同时定义一个继承自TclClass类的静态类,在这个类中我们完成编译对象同解释对象的类名一一对应,同时为解释对象中的类添加两个成员函数,在实际tcl脚本的执行过程中,解释对象的这两个成员函数实际上会执行编译对象的成员函数。其中一个成员函数就会创建并获取编译类对象的指针,这样在创建解释对象时同时也完成了编译对象的创建,这个过程是通过这个定义的个TclClass静态类来完成的。
实际上在脚本创建otcl对象的时候,首先会用到new这个命令,new这个命令会调用,create这个命令,就是创建octl解释类对象,创建时会执行解释类对象的构造函数init,在init中会调用create-shadow这个函数,进而就创建了编译类对象并完成了类名一一对应。这个过程中涉及到一些细节,详细请见博客,也会用到tcl类,大体流程就是这个样子。
其实在TclClass的bind函数中,有向OTcl注册对象添加两个函数create-shadow和delete-Shadow的代码,感觉这两句代码才是有意思,如何实现呢,就是在用tcl脚本命令时,会调用定义的TclClass类内create-shadow和delete-Shadow函数,很神奇。
贴几张学习时的笔记,照片不是很清楚,不过内容也没什么价值,看上面转的博客就行了。