建立一個Agent/MyAgent詳細過程

來源:互聯網
上載者:User

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

    1. 建立網路對象類

    2. 建立對象映射類public TclClass

    3. 綁定C++成員變數和OTcl變數 (bind)

    4. 對C++成員變數的控制 (Command或成員函數)

    5. 將.cc檔案進行編譯 (make)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.