------------ ------------
| 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”类的连接,我认为交叉引用可能是一种不错的方式(从 OLSR 到 PriQueue 的连接是在 NS2 中使用指针“target_”自动设置的,其类型为 NsObject*)。
部分代码在下面给出。但问题是,指针“olsr_callback”始终为 NULL。因此,当从 PriQueue 对象调用函数 add_rr_ack() 时,访问“ra_addr_”变量的行将产生分段错误。
nsaddr_t addr = ra_addr();
(如果“ ”行被阻塞,程序可以正常工作)
交叉引用机制是从这个页面获得的: 交叉引用如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);
.....
}
PS:我还尝试将 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() 函数。