NS2中OTcl类和C++类的连接(完)

当生成一个TclObject时,NS2会自动的建立一个影子编译对象。在3.4.2节中,我们解释了TclObject的生成机制。我们注意到,TclClass类与影子对象的生成有关。我们现在就解释一下TclClass还有影子对象生成的细节。

3.5.1 TclClass类综述

TclClass负责在编译体系内建议影子对象。该类把OTcl类映射给C++的一个静态的映射变量,并提供在编译体系内生成影子对象的方法。程序3.11列出了TcpClass的细节:把解释体系内的Agent/TCP类映射给编译体系内的静态映射变量class_tcp。

NS2中OTcl类和C++类的连接(完)_第1张图片

不同于其他类,TclClass类的子类在同一个地方声明,执行和实例化。在程序3.11中,TclClass的一个子类只包含两个两个函数:构造函数和creat(…)函数。其中creat函数生成影子对象。为了为OTcl的Agent/TCP生成一个影子对象,我们需要在编译体系内执行下列步骤:

i)生成影子编译类

ii)从TclClass继承一个映射类(例如TcpClass)

iii)给这个映射类添加一个实例(例如class_tcp)

iv)定义这个映射子类的构造函数(3行~11行),添加OTcl类的类名(例如Agent/TCP)作为基类构造函数的输入参数,例如TclClass)

v)定义creat函数来构造影子编译对象。调用new函数来产生影子编译对象(例如,newTcpAgent)并返回以生成的对象(程序3.11的第5行)。

3.5.2 TclObject 的生成

我们现在来解释一下TclObject的整个生成过程。考虑图3.3,TclObject 的生成过程如下:

  1. 象在3.4.2小节中一样,生成一个OTcl对象
  2. 调用TclClass函数的实例程序create-shadow
  3. 在creat-shadow函数中调用TcpClass中的create(…)函数
  4. 在程序3.11中,第5行中的create(…)函数执行“new TcpAgent”并返回生成的对象
  5. 调用其父类的构造函数构造一个TcpAgent对象
  6. 构造Agent对象。其中包括绑定在解释体系内所有变量。
  7. 返回TcpAgent类,构造TcpAgent对象,绑定在解释体系所有变量。
  8. 返回生成的影子对象给SplitObject::init{…},程序继续进行。

3.5.3 TclClass的命名规范

现在我们来讲一讲继承自TclClass类的子类和其对应静态变量的命名规范。首先,每个子类都是直接从TclClass继承而来,而不管其类体系所属。例如,RenoTcpAgent继承自TcpAgent,但是它的映射类RenoTcpClass和TcpClass均继承自TclClass。

其次,它的命名规范十分类似于C++变量的命名规范。在大多数情况下,我们仅在其C++类名后面加上Class字样即成。而其静态变量则需要在前面加上class_。表3.4列出了几个例子。

NS2中OTcl类和C++类的连接(完)_第2张图片

3.5.4 映射变量的实例化

在NS2启动时,所有的静态映射变量都会实例化。在此,TclClass类把OTcl类名存储在变量classname_中,把所有的映射变量存储在链表all_中。在所有的映射变量被存储在链表中之后,调用TclClass::bind(…)。bind(…)在系统中注册all_中所有的映射变量,并创建相对应的解释体系。bind(…)函数同时也将create-shadow和delete-shadow函数绑定于映射类(如TcpClass)的create-shadow{…}和delete-shadow{…}。在这之后,NS2重新组织所有的OTcl类名。OTcl类对象的建立遵循3.4.2小节和3.5.2小节的步骤。

你可能感兴趣的:(NS2)