分裂对象模型和TclCL(3)

举个例子从整体说明OtclC++之间的对象连接机制

 

1、  tcp.h中的TcpAgent类声明如下:

class TcpAgentpublic Agent {

public:

     TcpAgent();

     virtual void recv(Packet*,Handle*);

     virtual void timeout (int ton);

     virtual void timeout_nonrtx (int ton);

     int command(int argc,const char*const* argv);

     virtual void sendmsg(int nbytes,const char *flags=0);

…..}

2、  tcp.cc中定义了一个TclClass的子类:

Static classTcpClass: public TclClass {

public:

TcpClass(): TclClass(“Agent/TCP”){}

TclObject* create(int,const char*const*){

      return (new TcpAgent());

} 

}class_tcp;

注意:此处不仅声明了这个类,而且实例化了,创建了一个实例 class_tcp。因此当NS刚刚运行是,这个类的构造函数就被执行一次。结果:有两个OtclAgentAgent/TCP声明了,同时class_tcpAgent/TCP关系登记下来。

3、  NS开始运行时,用户在Tcl脚本中正在执行”new Agent/TCP”.那么在new{}过程中,一个Agent/TCP的解释对象被创建了,并且调用了其实例过程init{}。代码如下:

Agent/TCP instproc init{}{

  eval $self next

  set ns [simulator instance]

 $ns create-eventtrace Event $self

}

可以看到,父类的init过程最先调用。这最终导致基类SplitObjectinit过程被调用,在那里create-shadow方法负责创建影像对象。根据2步中TcpClass所登记的关联关系,class_tcpcreate函数被调用了。class_tcpcreate函数创建一个TcpAgent对象,并返回了其指针。这个编译对象的指针在后面调用command函数时是要用的。创建编译对象时,它的构造函数被执行了。TcpAgent的构造函数代码如下:

TcpAgent:: TcpAgent():Agent(PT_TCP),

  T_seqno_(0),t_rtt(0),t_srtt(0),….

{….

 bind(“rtt_”,&t_rtt_);

 bind(“seqno_”,&curseq_);

 bind(“cwnd_”,&cwnd_);

…….

}

构造函数中建立了绑定变量。于是在解释对象中有了rtt_seqno_cwnd_等成员变量并且自此以后这些变量和它们所各自绑定的编译对象的成员变量在任何时候都取相同的值。

在绑定时,这些变量被初始化了,被设置为Agent/TCP(或其某个父类)中定义的同名变量的取值。这些变量的缺省值是在~ns/tcl/lib/ns-default.tcl中被设置的:

 Agent/TCP set rtt_ 0

 Agent/TCP set seqno_ 0

 Agent/TCP set cwnd_ 0

………….

这部分脚本是在NS开始运行后先于用户的Tcl脚本之前被运行的。所以当创建对象中绑定变量时,这部分脚本已经被执行过了,这些缺省值是有效的。

至此,互为影像的解释对象和编译对象创建完成。

之后,当要执行这个解释对象的一个操作时,如果该操作不是一个有效的实例过程或明命令,就会利用刚才保存的编译对象的指针,去调用编译对象的command函数。在command函数中,根据传入的命令行参数执行操作,并返回TCL_OKTCL_ERROR来告知解释类操作成功与否。为了使得这个操作有类似Otcl实例过程一样的继承性,在command函数最后调用了其父类的command函数。

对象连接的整个过程就完成了。

原文链接: https://www.cnblogs.com/zhangleiccst/archive/2011/08/28/2156236.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    分裂对象模型和TclCL(3)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/31337

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午8:35
下一篇 2023年2月8日 上午8:35

相关推荐