omn​​et++中继承自AdhocHost的新模块

A new module that inherit from AdhocHost in omnet++

我需要一个继承自 AdhocHost 的新模块。之前问的朋友this question, and Mr Jerzy D回答说:

In OMNeT++ behavior is defined only for simple modules. So one cannot define a C++ classes for a compound module.

但手册指出:

Although the C++ class for a compound module can be overridden with the @class property, this is a feature that should probably never be used. Encapsulate the code into a simple module, and add it as a submodule.

如何创建这个模块?从头开始创建 cSimpleModule 模块是不合逻辑的,因为我想使用预定义的 AdhocHost 参数、方法...以及我的新定义。

你是对的,在OMNeT++中可以为复合模块定义一个class。你提到的我的回答不是 100% 正确。


要创建一个继承自 AdhocHost 并拥有自己的 class 的新模块,至少应该这样做:

  1. inet4\src\inet\node\inet中创建一个新文件AdhocHostExtended.ned

    package inet.node.inet;
    import inet.node.inet.AdhocHost;
    
    module AdhocHostExtended extends AdhocHost {
        @class(AdhocHostExtended);
        int par1;
        double par2;
    }
    
  2. 在同一目录下创建AdhocHostExtended.h:

    #ifndef __INET4_ADHOCHOSTEXTENDED_H_
    #define __INET4_ADHOCHOSTEXTENDED_H_
    
    #include <omnetpp.h>
    using namespace omnetpp;
    
    namespace inet {
    
    class AdhocHostExtended : public cModule  {
      protected:
        virtual int numInitStages() const override { return NUM_INIT_STAGES; }
        virtual void initialize(int stage) override;
        virtual void handleMessage(cMessage *msg);
    };
    
    } //namespace
    #endif
    
  3. 在同一目录下创建AdhocHostExtended.cc:

    #include "AdhocHostExtended.h"
    namespace inet {
    
    Define_Module(AdhocHostExtended);
    
    void AdhocHostExtended::initialize(int stage) {
      // an example of reading new parameter in the first stage
      if (stage == INITSTAGE_LOCAL) {
         EV << "par1 = " << par("par1").intValue() << endl;
      }
      // your code
    }
    
    void AdhocHostExtended::handleMessage(cMessage *msg) {
         // your code
    }      
    
    } //namespace
    

注意在 initialize() 中使用适当的舞台。阶段在 /inet4/src/inet/common/InitStages.h

中定义