【问题标题】:Omnet++ Error setting parameter in child Class and calling it in another child ClassOmnet++ 在子类中设置参数并在另一个子类中调用它时出错
【发布时间】:2016-11-21 13:56:18
【问题描述】:

我正在尝试在子类 PassiveQueueBase 中设置一个参数,并在基类 IPassiveQueue 的另一个子类 PriorityScheduler 中调用它。

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 文件,它是许多其他类的接口文件。

我尝试做的如下所示,

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;
}

运行模拟时出现错误,如下所示

模拟以退出代码终止:139 工作目录: /home/usrname/omnetpp-5.0/samples/inet/examples/mysimulation 命令行: opp_run -r 0 -n ..:../../src:../../tutorials -l ../../src/INET --debug-on-errors=false omnetpp.ini

这一行还有感叹号

pqueue->setWindows();

附上这篇笔记

‘Pqueue’可以在这个函数中使用未初始化 [-W可能未初始化]

【问题讨论】:

  • 您打算将修改后的队列类用作典型的OMNeT++ 队列吗?如果是,您应该准备一个继承自PassiveQueueBaseIQueueAccess 的新类,其中PassiveQueueBase 是INET 中已经存在 的类(不是您的类)。
  • 好吧,这是我在这个问题中展示的一步,因为我希望这个变量出现在 DropTailQueue 中,它再次继承自 QueuePassiveBase。我在交换机的内部队列中使用 DropTailQueue。所以我不会说这是我的个人课程,我仍在使用 omnet++ Queue。
  • 在您的问题中,您提出了IPassiveQueue 类,它与INETIPassiveQueue 不同。如果你想使用自己的队列,我强烈建议准备一个继承自 PassiveQueueBaseIQueueAccess 的新类。在这个新类中,您可以添加自己的变量以及自己的行为。
  • 对不起,我现在明白你的意思了。会努力的。

标签: c++ omnet++ inet


【解决方案1】:

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

IPassiveQueue *pqueue;

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

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

IPassiveQueue *pqueue = new IPassiveQueue;

并确保使用delete删除它

delete pqueue;

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

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

【讨论】:

  • 对于该行 IPassiveQueue *Pqueue = new IPassiveQueue; 我收到错误 invalid new-expression of abstract class type 'inet::IPassiveQueue' 对于最后一行,我在尝试查找时遇到语法错误用于 omnet 的。完成后会建议您。
  • 我只知道在 omnet++ 中不可能使用带有接口 Ned 文件的 new
  • 抱歉回复晚了,它说你的 IPassiveQueue 是一个抽象类,你不能创建一个抽象类型的对象。您应该在 IPassiveQueue 中实现所有纯虚函数
  • 没问题,你是对的。我实际上可以创建一个单独的函数来创建指针,就像指针 inputQueue 的情况一样,但我结束了使用 inputQueue 本身。
【解决方案2】:

嗯,我考虑过使用 inputQueue 本身作为指针,而不是在函数上创建与子类中完全相同但为空的新指针,并且它有效。

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多