如何在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
相关产品推荐
相关产品推荐

