------------ ------------
| 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.В результате при вызове функции add_rr_ack () из объекта PriQueue строка, обращающаяся к переменной ra_addr_, сгенерирует ошибку сегментации .
(Программа работает нормально, если строка "nsaddr_t addr = ra_addr();
" заблокирована)
Механизм перекрестной ссылки получен с этой страницы: перекрестная ссылка, как указано в посте 4
Я думаю, это проблема способа, которым я пытался передать указатель "this" в send_pkt ().Но я не могу понять, что не так.Если у вас есть идеи, пожалуйста, помогите мне.
Любая помощь будет оценена.
Шу.
//------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: Я также пытался изменить recvФункция () в классе PriQueue выглядит следующим образом:
//------priqueue.h------//
void recv(Packet* p, OLSR* h);
// ------priqueue.cc-----//
void PriQueue::recv(Packet* p, OLSR*h) {
......
olsr_callback = h;
......
}
// Однако в этом случае, когда мы вызываем функцию recv () из send_pkt ().Фактически он вызовет функцию recv () очереди Base, а не функцию recv () PriQueue, как ожидалось.