handleMessage 看不到我的 类 和功能

handleMessage doesnt see my classes and functions

我正在用 omnet++ 编写这段代码,它应该每 T 次从不同的节点向一个中央节点发送消息。我现在的问题是 handleMessage 函数看不到 类 和我创建的函数,而 inizialize 看到了所有内容;我是编程新手,也是 C++ 语言的新手 :)。 代码:

using namespace omnetpp;
class Net : public cSimpleModule
{
public:   
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
};

class Central_Node : public Net
{
    simtime_t time_stamps[];
    int index;

public:
    void addTimeStamp()
    {
      int array_size = sizeof(time_stamps);
      time_stamps[array_size] = SimTime();
    }
    void deleteSignal(cMessage *msg)
    {
        delete msg;
    }
};

class Sensor : public Net
{
    int index;
    double delay;

public:
    Sensor(int a, double b)
    {
        index = a;
        delay = b;
    }

    void sendMessage()
    {
        cMessage *msg = new cMessage("Signal");
        send(msg, 0);
        cMessage *SelfMsg = new cMessage("SelfMessage");
        scheduleAt(simTime() + delay, SelfMsg);
    }
};


Define_Module(Net);

void Net::initialize()
{    
    Central_Node centralNode;
    Sensor Sensor1 (1,100);
    Sensor Sensor2 (2,210);

    Sensor1.sendMessage();
    Sensor2.sendMessage();
}

void Net::handleMessage(cMessage *msg)
{
    if (getIndex() == 0) 
    {
        simtime_t ArrivalTime = centralNode.addTimeStamp();
        centralNode.deleteSignal(*msg);
    }

    if (getIndex() == 1) 
    {
        Sensor1.sendMessage();
    }

    if (getIndex() == 2) 
    {
       Sensor2.sendMessage();
    }
}

我得到的错误是:use of undeclared identifier 'centralNode' 在行 simtime_t ArrivalTime = centralNode.addTimeStamp();.

问题是在使用的时候,centralNode不是定义的变量:

void Net::handleMessage(cMessage *msg)
{
  if (getIndex() == 0) 
  {
      // Error:  use of undeclared identifier 'centralNode'
      simtime_t ArrivalTime = centralNode.addTimeStamp();  
      centralNode.deleteSignal(*msg);
  }
  [...]
}

您在 Net::initialize() 成员函数中创建了一个 centralNode 变量,但它是函数 中的一个 局部变量,而不是 class 成员。 Net::initialize() 函数中的那个 centralNode 变量在任何其他成员函数中自然是不可见的,包括 Net::handleMessage 成员函数。

有两种可能的解决方案。

选项 1:在 Net::handleMessage

中创建局部变量

您可以在 Net::handleMessage() 中声明局部变量,就像 Net::initialize() 函数一样。这个 Central_Node 对象一旦超出范围就会 "disappear" (被销毁)。

void Net::handleMessage(cMessage *msg)
{
  if (getIndex() == 0) 
  {
      Central_Node centralNode;    // Instantiate here before use.
      simtime_t ArrivalTime = centralNode.addTimeStamp();  
      centralNode.deleteSignal(*msg);
  }
  [...]
}

选项 2:在网络中创建数据成员class

您可以在 Net class 中声明一个 class 数据成员。然而,这很复杂,因为 Net class 将包含一个 Central_Node 数据成员,但 CentralNode class 本身继承自 Net

要打破这种循环依赖,您可以前向声明 Central_Node 并在 Net class:

中使用指针
class Central_Node;  // Forward declaration

class Net : public cSimpleModule
{
    // unique_ptr required to break circular dependency
    std::unique_ptr<Central_Node> centralNode;
    [...]
};

一般评论

通常,当代码表现出循环依赖时,这表明代码中表达的抽象或关系不正确。

在这种情况下,Central_Node 继承自 Net(大概是 "Network")class 似乎是错误的。继承class专门用来表达"is-a"关系,说"A Central_Node (or any Node) is a Network"就很奇怪了。相反,节点(包括 CentralNode)是网络的一部分,或者网络包含节点。

除此之外,我认为 Central_Node:: addTimeStamp() 成员函数中存在错误,因为数组数据成员从未被初始化。我怀疑,如所写,这会在运行时导致段错误或其他崩溃。