一、创建和销毁TclObject
在Otcl脚本中使用new{}和delete{}。举个例子:
set tcp1 [new Agent/TCP]
delete $tcp1
过程new{}的执行过程:
1创建出解释对象
2执行该对象的初始化实例过程init{},并把用户提供的参数传给它。
3在基类SplitObject的初始化实例过程中,通过create-shadow方法创建该对象在C++中的影像对象。
4影像对象的构造函数将被执行,其中会进行一些变量绑定工作。
因此每个解释类都必须在初始化实例过程中调用其父类的初始化实例过程,以便最终执行到基类SplitObject的初始化实例过程去创建影像对象。
创建影像对象的机制只有当用户从解释器中创建对象时才起作用。
二类TclClass
TclClass用来解决create-shadow。从这几基类继承出来的类有两个功能:构造和编译类结构互为镜像的解释类结构以及提供初始化新的TclObject的方法。
每个从TclClass继承出来的类都和编译类结构中的一个TclObecy的子类相关联,并能初始化所关联的新的对象。举个例子比较明了:
类RenoTcpClass。它从类TclClass继承而来,并和类RenoTcpAgent相关联。它将初始化类RenoTcpAgent的新对象。RenoTcpClass定义如下:
static class RenoTcpClass:public TclClass{
public:
RenoTcpClass:TclClass(”Agent/TCP/Reno”){}
TclObject* create (int argc,const char*const* argv){
return (new RenoTcpAgent());
}
}class_reno
方法create用以创建所关联的TclObject子类的实例。其构造函数中通过调用基类的构造函数TclClass(”Agent/TCP/Reno”)指定了其对应的解释类为Agent/TCP/Reno。这就是一种登记工作,以后每当在解释器中创建Agent/TCP/Reno对象时,create-shadow都会调用这个RenoTcpClass类的create函数,从而创建出正确的影像对象。
TclClass的构造函数除了完成这种登记工作外,还起到了声明Otcl类的作用。在此例中TclClass一共声明3个解释类:Agent、Agent/TCP、Agent/TCP/Reno,并定义了它们的继承关系。
变量绑定:当该对象初始化时在编译对象的构造函数中建立的,在对应的解释对象中可以作为一个实例变量来访问。
要在Otcl对象中调用对应的C++对象的方法,是通过command()函数实现。对于每个TclObject,ns都为其Otcl中的解释对象建立一个实例过程cmd{},过程cmd{}调用影像对象的方法command(),并将cmd{}的参数作为参数数组传递给command()方法。