------------ ------------
| 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);
--------------
Liebe alle, ich verwende NS2, um ein Netzwerk-Codierungsprotokoll zu implementieren. Ich stecke jedoch seit Tagen in einem Problem fest, das sich auf die Querverweise zwischen Klassen und die Art und Weise, wie der „this“-Zeiger übergeben wird, bezieht.
Die Klassenhierarchie wird in der obigen Abbildung gezeigt (Bitte entschuldigen Sie, dass es so aussieht, ich bin ein neuer Benutzer dieser Website und darf keine Bilder posten).
Im Programm muss ich eine Verbindung von der Klasse "PriQueue" zur Klasse "OLSR" herstellen, bei der ich denke, dass Querverweise eine gute Möglichkeit sein könnten (Die Verbindung von OLSR zu PriQueue wird automatisch in NS2 mittels des Pointers 'target_', der vom Typ NsObject* ist, festgelegt).
Ein Teil des Codes wird unten gegeben. Das Problem ist jedoch, dass der Zeiger "olsr_callback" immer NULL ist. Als Ergebnis erzeugt der Aufruf der Funktion add_rr_ack() vom Objekt PriQueue einen Sigmenationsfehler.
(Das Programm funktioniert einwandfrei, wenn die Zeile "nsaddr_t addr = ra_addr();
" blockiert ist)
Der Querverweismechnanismus wird von dieser Seite erhalten: Querverweis wie in Post 4 erwähnt
Ich vermute, dass es das Problem der Art und Weise ist, wie ich den „this“-Zeiger in send_pkt() übergeben habe. Aber ich kann nicht herausfinden, was falsch ist. Wenn Ihnen eine Idee einfällt, helfen Sie mir bitte.
Jede Hilfe wird geschätzt.
Shu.
//------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
#include
void OLSR::send_pkt() {
......
......
target_->recv(p,this); // 'target_' zeigt zur entsprechenden priqueue-Objekt
// während der Laufzeit
}
Packet* OLSR::add_rr_ack(Packet* p, PriQueue*) {
......
nsaddr_t addr = ra_addr(); // Erzeugt einen Segmenationsfehler!!!!!
.......
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
#include "priqueue.h"
PriQueue::PriQueue() : DropTail(),olsr_callback(NULL) {......}
PriQueue::recv(Packet* p, Handler* h) {
......
olsr_callback = dynamic_cast(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: Ich habe auch versucht, die recv() Funktion in der Klasse PriQueue wie folgt zu ändern:
//------priqueue.h------//
void recv(Packet* p, OLSR* h);
// ------priqueue.cc-----//
void PriQueue::recv(Packet* p, OLSR*h) {
......
olsr_callback = h;
......
}
// In diesem Fall ruft der Aufruf der recv() Funktion aus send_pkt() tatsächlich die recv() Funktion der Basisklasse Queue auf, nicht die recv() Funktion von PriQueue, wie erwartet.