交叉引用并在类之间传递此指针[NS2 / C]

              ------------                       ------------
              | 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,而不是不相关的类.

点赞