------------ ------------
| TclObjct | | Handler |
------------ ------------
|__________________________________|
|
--------------
| NsObject |---> virtual void recv(Packet*,Handler* callback = 0) = 0;
--------------
|
--------------
| Connector |
--------------
|
________________________________
| |
| -------------
| | Agent |
| -------------
| |
| -------------
| | OLSR |
------------- -------------
| Queue |-----> virtual void recv(Packet*, Handler*);
-------------
|
-------------
| DropTail |
-------------
|
-------------
| PriQueue |-----> void recv(Packet* p, Handler* h);
--------------
各位,
我正在使用NS2来实现网络编码协议(protocol)。但是我一直困扰着一个问题,关于类之间的交叉引用以及传递“this”指针的方式。
上图显示了类的层次结构(请原谅,我是该站点的新用户,并且不允许发布图像)。
在程序中,我必须创建一个从“PriQueue”类到“OLSR”类的连接,我认为交叉引用可能是一个不错的方法(从OLSR到PriQueue的连接是在NS2中使用指针“target_”自动设置的) ,其类型为NsObject *)。
下面给出了部分代码。
但是问题是,指针“olsr_callback”始终为NULL。结果,当从PriQueue对象调用函数add_rr_ack()时,访问'ra_addr_'变量的行将生成段错误。
(如果“
nsaddr_t addr = ra_addr();
”行被阻止,程序运行正常)交叉引用机制可从以下页面获得:
cross reference as stated in post 4
我想这是我尝试在send_pkt()中传递“this”指针的方式的问题。但我不知道出什么问题了。如果您有任何想法,请帮助我。
任何帮助将不胜感激。
淑
//------OLSR.h--------//
class PriQueue;
class OLSR : public Agent {
......
nsaddr_t ra_addr_;
void send_pkt();
......
public:
inline nsaddr_t& ra_addr() { return ra_addr_; }
Packet* add_rr_ack(Packet*,PriQueue*);
......
}
//------OLSR.cc------//
#include<olsr/OLSR.h>
#include<queue/priqueue.h>
void OLSR::send_pkt() {
......
......
target_->recv(p,this); // 'target_' points to the respective priqueue object
// during the runtime
}
Packet* OLSR::add_rr_ack(Packet* p, PriQueue*) {
......
nsaddr_t addr = ra_addr(); // Generate a segmentation error!!!!!
.......
return p;
}
......
//------priqueue.h------//
class OLSR;
class PriQueue : public DropTail {
public:
void recv(Packet* p, Handler* h);
......
Packet* deque();
OLSR* olsr_callback;
......
}
//------priqueue.cc------//
#include<olsr/OLSR.h>
#include "priqueue.h"
PriQueue::PriQueue() : DropTail(),olsr_callback(NULL) {......}
PriQueue::recv(Packet* p, Handler* h) {
......
olsr_callback = dynamic_cast<OLSR*>(h);
//Debug
printf("Packet received through recv() in PriQueue. \n");
......
}
PriQueue::deque() {
.....
Packet* p = q_->deque();
if(olsr_callback == NULL) printf("CALLBACK is NULL. \n");
Packet* p1 = olsr_callback->add_rr_ack(p);
.....
}
P.S:我还尝试如下更改PriQueue类中的recv()函数:
//------priqueue.h------//
void recv(Packet* p, OLSR* h);
// ------priqueue.cc-----//
void PriQueue::recv(Packet* p, OLSR*h) {
......
olsr_callback = h;
......
}
//
但是,在这种情况下,当我们从send_pkt()调用recv()函数时。实际上,它将实际调用基类Queue的recv()函数,而不是预期的PriQueue的recv()函数。
最佳答案
class OLSR : public Agent
您的OLSR类是从某个“代理”类派生的(我不知道它是什么)。我假设这不是从“Handle”派生的类之一(因为它未在图中显示)。
由于“OLSR”不是从“Handle”派生的,因此从“Handle”到“OLSR”的dynamic_cast失败。您只能从多态Base到Derived而不是不相关的类进行dynamic_cast。