一个简单的例子,但说明了Tcl和c++是如何映射的。程序的目的是创建一个新的网络对象类“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步
创建网络对象类
创建对象映射类public TclClass
绑定C++成员变量和OTcl变量 (bind)
对C++成员变量的控制 (Command或成员函数)
将.cc文件进行编译 (make)