一個簡單的例子,但說明了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)