NS2中OTcl类和C++类的连接(完)
2014-01-05 09:14
274 查看
当生成一个TclObject时,NS2会自动的建立一个影子编译对象。在3.4.2节中,我们解释了TclObject的生成机制。我们注意到,TclClass类与影子对象的生成有关。我们现在就解释一下TclClass还有影子对象生成的细节。
3.5.1 TclClass类综述
TclClass负责在编译体系内建议影子对象。该类把OTcl类映射给C++的一个静态的映射变量,并提供在编译体系内生成影子对象的方法。程序3.11列出了TcpClass的细节:把解释体系内的Agent/TCP类映射给编译体系内的静态映射变量class_tcp。
不同于其他类,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 的生成过程如下:
象在3.4.2小节中一样,生成一个OTcl对象
调用TclClass函数的实例程序create-shadow
在creat-shadow函数中调用TcpClass中的create(…)函数
在程序3.11中,第5行中的create(…)函数执行“new TcpAgent”并返回生成的对象
调用其父类的构造函数构造一个TcpAgent对象
构造Agent对象。其中包括绑定在解释体系内所有变量。
返回TcpAgent类,构造TcpAgent对象,绑定在解释体系所有变量。
返回生成的影子对象给SplitObject::init{…},程序继续进行。
3.5.3 TclClass的命名规范
现在我们来讲一讲继承自TclClass类的子类和其对应静态变量的命名规范。首先,每个子类都是直接从TclClass继承而来,而不管其类体系所属。例如,RenoTcpAgent继承自TcpAgent,但是它的映射类RenoTcpClass和TcpClass均继承自TclClass。
其次,它的命名规范十分类似于C++变量的命名规范。在大多数情况下,我们仅在其C++类名后面加上Class字样即成。而其静态变量则需要在前面加上class_。表3.4列出了几个例子。
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小节的步骤。
3.5.1 TclClass类综述
TclClass负责在编译体系内建议影子对象。该类把OTcl类映射给C++的一个静态的映射变量,并提供在编译体系内生成影子对象的方法。程序3.11列出了TcpClass的细节:把解释体系内的Agent/TCP类映射给编译体系内的静态映射变量class_tcp。
不同于其他类,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 的生成过程如下:
象在3.4.2小节中一样,生成一个OTcl对象
调用TclClass函数的实例程序create-shadow
在creat-shadow函数中调用TcpClass中的create(…)函数
在程序3.11中,第5行中的create(…)函数执行“new TcpAgent”并返回生成的对象
调用其父类的构造函数构造一个TcpAgent对象
构造Agent对象。其中包括绑定在解释体系内所有变量。
返回TcpAgent类,构造TcpAgent对象,绑定在解释体系所有变量。
返回生成的影子对象给SplitObject::init{…},程序继续进行。
3.5.3 TclClass的命名规范
现在我们来讲一讲继承自TclClass类的子类和其对应静态变量的命名规范。首先,每个子类都是直接从TclClass继承而来,而不管其类体系所属。例如,RenoTcpAgent继承自TcpAgent,但是它的映射类RenoTcpClass和TcpClass均继承自TclClass。
其次,它的命名规范十分类似于C++变量的命名规范。在大多数情况下,我们仅在其C++类名后面加上Class字样即成。而其静态变量则需要在前面加上class_。表3.4列出了几个例子。
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中OTcl类和C++类的连接(二)
- NS2中OTcl类和C++类的连接(三)
- NS2入门实例 2---无线网络,两节点(TCP连接,FTP应用)
- NS2中添加OTcl与C++之间的连接
- NS2中添加OTcl与C++之间的连接
- SUMO仿真快速入门系列五:SUMO与NS2连接
- 关于c++类模板及连接问题解决方法
- NS2入门实例 2---无线网络,两节点(TCP连接,FTP应用)
- 显式连接(动态链接)DLL中的C++类
- NS2入门实例 2---无线网络,两节点(TCP连接,FTP应用)
- [译] NS2中OTcl 和C++ 的连接
- 基于MFC通过AOD连接数据库的C++类
- 利用NS2的产生随机数机制来实现对链路的动态设置(连接建立时间,延迟)
- NS2中OTcl 和C++ 的连接 (一)
- NS2中添加OTcl与C++之间的连接
- NS2中添加OTcl与C++之间的连接
- (转)sumo和ns2连接
- JAVA 连接ORACLE数据库
- 检查匿名 SMTP 连接的中继限制
- mysql和vc++连接