Home > OS >  Getting an Attribute of a Child Class Crashes the Simulation
Getting an Attribute of a Child Class Crashes the Simulation

Time:04-14

In my OMNeT code, I want an Egg class to inherit from Chicken. Having said that, in my Chicken class I want to get a pointer to the Egg and work with it.

The following code crashes when Qtenvironment starts, saying Simulation terminated with exit code: 139

ChickenEggNetwork.ned

package chickenegg.simulations;

import chickenegg.Chicken;
import chickenegg.Egg;

network ChickenEggNetwork {
    submodules:
        chicken: Chicken;
        egg: Egg;
}

Chicken.ned

package chickenegg;

simple Chicken {
    @class(Chicken);
}

Chicken.h

#ifndef CHICKEN_H_
#define CHICKEN_H_

#include <omnetpp.h>
class Egg;  // forward declaration

class Chicken : public omnetpp::cSimpleModule {
private:
    void initialize(void);
    Egg* egg;  // Get a pointer to Egg class
};

#endif /* CHICKEN_H_ */

Chicken.cc

#include "Chicken.h"
#include "Egg.h"

Define_Module(Chicken);

void Chicken::initialize(void) {
    EV << "Hi, I am a chicken, I am " << egg->eggAge*100 << " days old \n";
}

Egg.ned

package chickenegg;

simple Egg extends Chicken {
    @class(Egg);
}

Egg.h

#ifndef EGG_H_
#define EGG_H_

#include <omnetpp.h>
#include "Chicken.h"

class Egg : public Chicken {
private:
    void initialize(void);
public:
    int eggAge = 2;
};

#endif /* EGG_H_ */

Egg.cc

#include "Egg.h"

Define_Module(Egg);

void Egg::initialize(void) {
    EV << "Hi, I am an egg, I am " << eggAge << " days old \n";
}

Where am I making a mistake?

CodePudding user response:

As Lala5th and PaulMcKenize in the comments suggested, adding egg = new Egg(); in void Chicken::initialize(void) method in Chicken.cc solved the issue.

CodePudding user response:

One mustn't create an instance of a class of simple module. According OMNeT Simulation Manual:

Simple modules are never instantiated by the user directly, but rather by the simulation kernel.

If you want to obtain an access to module egg from chicken, in the code of Chicken use the following piece of code:

// in Chicken.cc
cModule *mod = getModuleByPath("^.egg");  // ^ means the parent module
if (mod) {
   egg = dynamic_cast<Egg*> (mod);
   if (egg) {
      EV << "Hi, I am a chicken, I am " << egg->eggAge * 100 << " days old \n";
   }
}

Reference: Finding Modules by Path

  • Related