------------ ------------
| 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来实现网络编码协议.但是我几天都遇到了关于类之间的交叉引用和传递“this”指针的方法的问题.
类层次结构如上图所示(请原谅我看起来像这样,我是这个站点的新用户,不允许发布图像).
在程序中我必须创建一个从“PriQueue”类到“OLSR”类的连接,我认为交叉引用可能是一个很好的方法(使用指针’target_’在NS2中自动设置从OLSR到PriQueue的连接,类型为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派生自某些类’Agent'(我不知道它是什么).我假设这不是从’Handle’派生的那些类之一(因为它没有在图中显示).
由于’OLSR’不是从’Handle’派生的,因此’Handle’到’OLSR’的dynamic_cast失败.您可以执行dynamic_cast,从多态Base到Derived,而不是不相关的类.