最近一直在理解NS2所谓的分裂对象模型,想知道ns是如何通过Otcl来创建C++对象的。下面把学习的一些心得总结一下。
Otcl其实就是面向对象的tcl,这和C++和C的关系是一样的。
Otcl和Tcl一样是可嵌入的,它提供了C的API接口,我们可以通过这些接口来访问Otcl对象。主要的接口描述见~/otcl/otcl.h文件
Otcl的基类是Object,所有的类都是从Object派生出来的。该类包含了对象的初始化和销毁过程,添加类成员函数和成员变量及其查询的一些方法。归纳如下:
Class | 创建一个对象 |
Destroy | 销毁一个对象 |
proc | 定义Tcl对象方法 |
set | 定义Tcl对象变量 |
instvar | 绑定实例变量 |
有关Otcl的详细语法可见:
http://bmrc.berkeley.edu/research/cmt/cmtdoc/otcl/
下面开始来看看是怎么通过OTcl来操纵C++对象的:
一、C++对象的创建
NS2采用的分裂对象模型,即每个C++的类都有一个Otcl类与之相对应。NS2中所有类的基类是TclObject,而Otcl中的基类则为SplitObject。下面首先看一下SplitObject这个类的定义(~/tclcl.*/Tcl-object.tcl):
Class SplitObject SplitObject set id 0 SplitObject instproc init args { $self next if [catch "$self create-shadow"text" > $args"] { error "__FAILED_SHADOW_OBJECT_" "" } } SplitObject instproc destroy {} { $self delete-shadow $self next }
由于每一个Otcl对象的创建都要调用其init过程,因此所有继承于SplitObject的Otcl类的初始化最终都会调用到SplitObject的init()这个instproc。
从上面代码中可以看到,init()实际上是调用了一个叫create-shadow的函数,这个函数就是用来创建C++对象的,这在后面会分析到。
同时,SplitObject也重载了destroy()函数,调用了一个叫delete-shadow的方法,顾名思义,也就是销毁相应的C++对象。
注意:Otcl并不会像C++那样会