Omnet++ 在子 Class 中设置参数并在另一个子 Class 中调用它时出错

Omnet++ Error setting parameter in child Class and calling it in another child Class

我正在尝试在子 class 的 PassiveQueueBase 中设置一个参数,并在另一个子 class PriorityScheduler 用于基础 Class IPassiveQueue.

PriorityScheduler 继承自 SchedulerBase,它有一个指针 (inputQueue) 指向 IpassiveQueue 类型的人,并将调用 PacketEnqueued() 函数给 PriorityScheduler。这显示在这段代码中

class INET_API SchedulerBase : public cSimpleModule, public IPassiveQueue, public IPassiveQueueListener
{
    public:
    virtual void packetEnqueued(IPassiveQueue *inputQueue) override;
};

注: IpassiveQueue.h没有.cc文件,它是许多其他classes的接口文件。

我尝试做的事情如下所示,

class INET_API IPassiveQueue
{
  public:
    simtime_t sendWindowStart;
    simtime_t sendWindowEnd;
    virtual void setWindows() {};
};

class INET_API PassiveQueueBase : public cSimpleModule, public IPassiveQueue
{  protected:
    void setWindows(simtime_t SWS,simtime_t SWE);
};

void PassiveQueueBase :: setWindows(simtime_t SWS,simtime_t SWE)
{   SWS = 3;  SWE = 4;                  
sendWindowStart = SWS;               
sendWindowEnd = SWE;             
};

bool PriorityScheduler::schedulePacket()
{
IPassiveQueue *pqueue;
pqueue->setWindows();
sendWindowStart = inputQueue->sendWindowStart;
sendWindowEnd = inputQueue->sendWindowEnd;
}

我在运行模拟时出错,如下图

Simulation terminated with exit code: 139 Working directory: /home/usrname/omnetpp-5.0/samples/inet/examples/mysimulation Command line: opp_run -r 0 -n ..:../../src:../../tutorials -l ../../src/INET --debug-on-errors=false omnetpp.ini

而且我在这一行上有感叹号

pqueue->setWindows();

附上这张便条

‘Pqueue’ may be used uninitialized in this function [-Wmaybe-uninitialized]

你还没有分配pqueue,你正在使用它

IPassiveQueue *pqueue;

这个仍然指向内存中的未知位置。

要解决此问题,您可以使用 new

分配它
IPassiveQueue *pqueue = new IPassiveQueue;

并确保使用 delete

删除它
delete pqueue;

也可以使用智能指针分配,这样更安全

std::unique_ptr<IPassiveQueue> pqueue(new IPassiveQueue);

好吧,我考虑过使用 inputQueue 本身作为指针,而不是在与子 class 完全相同但为空的函数上创建新指针,但它起作用了。

class INET_API PriorityScheduler : public SchedulerBase
{
  protected:
    virtual bool schedulePacket() override;
    simtime_t sendWindowStart;
    simtime_t sendWindowEnd;
    simtime_t SWS;
    simtime_t SWE;
};

bool PriorityScheduler::schedulePacket()
{
    inputQueue->setWindows( SWS, SWE);
    sendWindowStart = inputQueue->sendWindowStart;
    sendWindowEnd = inputQueue->sendWindowEnd;
}

class INET_API IPassiveQueue
{
  public:
    simtime_t sendWindowStart;
    simtime_t sendWindowEnd;
    virtual void setWindows(simtime_t SWS,simtime_t SWE) {};
}

class INET_API PassiveQueueBase : public cSimpleModule, public IPassiveQueue
{
  protected:
    virtual void setWindows(simtime_t SWS,simtime_t SWE) {};
}

void PassiveQueueBase::setWindows(simtime_t SWS,simtime_t SWE)
{   SWS = 1; SWE=5;
sendWindowStart = SWS;
sendWindowEnd = SWE;
}