OMNeT++重写getDisplayString()后消息显示字符串未更改求助
问题描述
按照OMNeT++官方文档要求,在自定义消息基类MyMsg_Base中重写了getDisplayString()函数,仿真时EV输出的"ECHO"正常打印,说明函数已被调用,但消息显示字符串仍为(MyMsg_Base)未更改。相关代码如下:
class MyMsg_Base : public ::omnetpp::cPacket { protected: uint8_t M_Header = 0; omnetpp::opp_string M_Payload; uint8_t M_Trailer = 0; int M_Type = 0; private: void copy(const MyMsg_Base& other); protected: bool operator==(const MyMsg_Base&) = delete; // make assignment operator protected to force the user override it MyMsg_Base& operator=(const MyMsg_Base& other); public: // make constructors protected to avoid instantiation MyMsg_Base(const char *name=nullptr, short kind=0); MyMsg_Base(const MyMsg_Base& other); virtual ~MyMsg_Base(); virtual MyMsg_Base *dup() const override {return new MyMsg_Base(*this);} virtual void parsimPack(omnetpp::cCommBuffer *b) const override; virtual void parsimUnpack(omnetpp::cCommBuffer *b) override; virtual uint8_t getM_Header() const; virtual void setM_Header(uint8_t M_Header); virtual const char * getM_Payload() const; virtual void setM_Payload(const char * M_Payload); virtual uint8_t getM_Trailer() const; virtual void setM_Trailer(uint8_t M_Trailer); virtual int getM_Type() const; virtual void setM_Type(int M_Type); virtual const char *getDisplayString() const override { EV << "ECHO" << std::endl; return "whyyyyyyyyyyyy"; } };
解决方法
出现这个问题的核心原因有两个,对应解决方式如下:
1. 修正显示字符串格式
OMNeT++的getDisplayString()返回的是属性化配置字符串,而非直接的显示文本。如果要自定义消息显示的文本内容,需要使用label=前缀来指定标签内容。修改重写的函数:
virtual const char *getDisplayString() const override { EV << "ECHO" << std::endl; return "label=whyyyyyyyyyyyy"; }
2. 调整模块的可视化配置
默认情况下,OMNeT++的模块(如队列、交换机)或传输链路会优先显示消息的类名/名称,而非消息自身的getDisplayString()返回值。需要在NED文件中修改对应模块的display属性,让它引用消息的显示字符串:
// 以自定义队列模块为例 simple MyQueue extends Queue { display="messages=$displayString"; }
此外,也可以在Qtenv仿真界面中右键点击消息,选择Display Options,确认是否勾选了"Use Display String"相关选项,确保界面优先使用消息的自定义显示配置。
内容的提问来源于stack exchange,提问作者abdo Salm
相关产品推荐
相关产品推荐

