------------                       ------------
              | 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。

09-07 09:45