You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OMNeT++的.cc文件中调用.msg定义的cPacketQueue成员?

解决OMNeT++中.msg定义的非cobject成员无法调用访问方法的问题

问题根源

OMNeT++的消息编译器(msgc)只会给基本数据类型、cobject派生类型的成员自动生成getter/setter方法。你定义的Fmqueue被标记为noncobject,所以DownFrame里的DFrameQueue成员不会自动生成getDFrameQueue()这类方法,而FrameSize是int类型(基本数据类型),所以自动生成了getFrameSize()。

三种解决办法

1. 用注解自动生成访问方法

修改DownstreamFrame.msg,给DFrameQueue加上@getter和@setter注解,让编译器自动生成访问方法:

cplusplus{{
#include <omnetpp.h>
typedef cPacketQueue* Fmqueue;
}}
class noncobject Fmqueue;

packet DownFrame
{
   @getter @setter
   Fmqueue DFrameQueue;
   int FrameSize = 155520;
}

重新编译项目后,就能在OLT.cc里直接调用queue->getDFrameQueue()获取队列指针,进而调用insert()、send()方法了。

2. 手动声明访问方法

也可以直接在packet块里手动写getter/setter的声明,编译器会自动补全实现:

cplusplus{{
#include <omnetpp.h>
typedef cPacketQueue* Fmqueue;
}}
class noncobject Fmqueue;

packet DownFrame
{
   Fmqueue DFrameQueue;
   int FrameSize = 155520;

   // 声明获取队列的方法
   Fmqueue getDFrameQueue();
   // 可选:声明设置队列的方法
   void setDFrameQueue(Fmqueue q);
}

编译后同样能在.cc文件里调用这些方法。

3. 直接访问成员(不推荐)

如果是旧版OMNeT++,生成的DownFrame成员可能是public的,可以直接访问,但这种写法破坏封装,不建议用:

// OLT.cc代码
DownFrame *queue = new DownFrame();
// 直接取成员指针
cPacketQueue* dQueue = queue->DFrameQueue;
// 调用队列方法
dQueue->insert(new cPacket("sample-packet"));

额外注意

使用DFrameQueue前一定要先初始化,比如创建DownFrame后给它分配一个cPacketQueue实例:

DownFrame *queue = new DownFrame();
queue->setDFrameQueue(new cPacketQueue());
// 之后再调用insert等方法
queue->getDFrameQueue()->insert(yourPacket);

内容的提问来源于stack exchange,提问作者Kanw Mpam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 03:03:20