(转)新建一个Agent/MyAgent详细过程

一个简单的例子,但说明了Tclc++是如何映射的。程序的目的是创建一个新的网络对象类“MyAgent”,它是”Agent”的子类。

    下面把我的ex-linkage.cc代码贴在这里:

//this is a simple agent just for show
#include <stdio.h>
#include <string.h>
#include "agent.h"


class MyAgent : public Agent {
public:
 MyAgent();
protected:
 int command(int argc,const char*const* argv);
private:
 int my_val1;
 double my_val2;
 void MyPrivFunc(void);
};
//===================================================================
//假设用C++新建了一个网络对象的类"MyAgent",它是从"Agent"类衍生出来,
//然后它能够建立一个OTcl对象的实例。为了实现这个功能我们必须定义一个
//联接对象"MyAgentClass" ,它从TclClass"衍生得来。这个联接对象创建了一个
//有指定命名的OTcl对象(这个例子名为:"Agent/MyAgentOtcl"),并建立一个联接
//在OTcl对象和C++对象("MyAgent")之间,它的实例运行"create"成员函数中指定
//的程序
//=========================================================================
static class MyAgentClass : public TclClass {//这个是映射对象类;是一个静态类;继承了TclClass
public:
 MyAgentClass() : TclClass("Agent/MyAgentOtcl") {}
 //创建指定名称"Agent/MyAgentOtcl"的Otcl对象
 TclObject* create(int,const char*const*) {
  return(new MyAgent());//这样就在OTcl和C++对象进行了联接,是实例的启动程序
 }
}class_my_agent;//NS启动时,就创建了一个实例.class_my_agent是一个静态变量

MyAgent::MyAgent():Agent(PT_UDP) {//这个函数的功能就是输出C++类成员变量到OTcl
 bind("my_val1_otcl",&my_val1);//将OTcl中的类成员变量和C++成员变量绑定,可以通过OTcl来控制C++成员变量了,推荐在ns-lib.tcl中设定默认值,否则有warning
 bind("my_val2_otcl",&my_val2);
}

int MyAgent::command(int argc,const char*const* argv) {//输出C++对象控制命令到OTcl,即定义一个命令解释器
if(argc==2) {
 if(strcmp(argv[1],"call-my-priv-func")==0) {
  MyPrivFunc();
  return(TCL_OK);
 }
 }
 return(Agent::command(argc,argv));//找不到则调用父类、祖类的command函数
}

void MyAgent::MyPrivFunc(void) {//在C++对象中执行OTcl命令,和上面的函数是相辅相成的
 Tcl& tcl=Tcl::instance();//生成一个TCL实例,然后通过函数传递命令,比如下面调用了两个函数
 tcl.eval("puts \"Message From MyPrivFunc\"");
 tcl.evalf("puts \"my_val1=%d\"",my_val1);
 tcl.evalf("puts \"my_val2=%d\"",my_val2);
}
 
具体步骤:

1、新建ex-linkage.cc文件,并放在~/ns2.29目录下。

2、打开~/tcl/lib/tcl-default.tcl文件,为成员变量赋缺省值:

##Agent set seqno_ 0 now is gone
##Agent set class_ 0 now is gone

Agent/MyAgentOtcl set my_val1_otcl 1
Agent/MyAgentOtcl set my_val2_otcl 0.0001

Agent/Ping set packetSize_ 64

3、在Makefile.in中添加ex-linkage.o \

4、最后./configure make

附上TCL测试脚本:

#create MyAgent 
set myagent [new Agent/MyAgentOtcl]

$myagent set my_val1_otcl 2
$myagent set my_val2_otcl 3.14

$myagent call-my-priv-func

 

总结一下,Tcl的映射主要分5

    1. 创建网络对象类

    2. 创建对象映射类public TclClass

    3. 绑定C++成员变量和OTcl变量 (bind

    4. C++成员变量的控制 (Command或成员函数)

    5. .cc文件进行编译 (make

posted on 2013-05-06 16:18  原来...  阅读(513)  评论(0编辑  收藏  举报

导航