首先我们来回顾一下,TclObject是干嘛的呢?我们又得从NS2的体系结构说起,NS2主要有两个层次:解释层次和编译层次,我们在平时使用NS2的时候,主要是Tcl的脚本编程,对应的也就是通过解释器生成Otcl的对象SplitObject,那么,我们如何与C++内核联系起来?也就是说,怎么进行mirror,生成shadow object,这里就用到了TclObject和TclClass,TclObject是所有模拟器对象的基类,也就说是所有模拟构件的基类,对应着解释层次的分裂对象,但是具体怎么将他们连起来就用到了TclClass。Tclobject和TclClass的关系就像被操纵者与操纵者。
如果还没有搞懂的话,请阅读我的另一篇文章《NS2入门教程——分裂对象模型》
示例:如何实例化一个TclObject
set srm [new Agent/SRM/Adaptive]
\$srm set packetSize_ 1024
\$srm traffic-source \$s0
其中,值得注意的是:
(解释层次)
Agent/SRM/Adaptive是Agent/SRM的子类,Agent/SRM是Agent的子类,Agent则是SpiltObject的子类。
(编译层次)
与Agent/SRM/Adaptive对应的shadow object是ASRMAgent,ASRMAgent是SRMAgent的子类,SRMAgent又是Agent的子类,而Agent则是TclObject的子类。
代码解释
第一行:实例化一个TclObject的对象。
第二行:配置一个绑定的变量。
第三行:说明了调用C++方法的Otcl对象
创建一个TclObject
具体创建过程,请参见我的另一篇文章《NS2入门教程——分裂对象模型》,这里只为大家缕清思路。
创建过程:(包括初始化)
- 启动NS2,这时候会创建一个Tcl的对象。
- 然后,进入静态类的初始化,比如说:SRMAgent;调用静态类的构造函数。
- 静态类继承自TclObject类,所以调用TclObject类的构造方法,TclObject的构造方法中调用了类方法bind,来为新生成的类绑定方法。
- bind方法用过Tcl调用SplitObject的register方法,生成了一个类(解释),并且绑定了两个方法create-shadow和delete-shadow
- 以上为初始化过程,现在我们使用new来实例化一个构件,这时候,他会调用create(解释层次),分配空间,并且返回句柄给用户,以便进一步操作。
- 然后调用新对象的构造函数,调用create-shadow方法。
- create-shadow实际上是调用了继承了TclClass的子类的create函数,也就是生成了对于的TclObject.
下面是Agent/SRM/Adaptive的构造函数:
Agent/SRM/Adaptive instproc init args {
eval \$self next \$args
\$self array set closest_ "requestor 0 repairor 0"
\$self set eps_ [\$class set eps_]
}
这里补充一下:
OTcl是不会自动调用父类构造函数的,必须手动调用,所以就像上面1代码的第一行一样。
网友评论