handleMessage看不到我的类和函数

handleMessage doesnt see my classes and functions

本文关键字:函数 我的 看不到 handleMessage      更新时间:2023-10-16

我正在omnet++中编写这段代码,它应该每T次从不同的节点向一个中心节点发送消息。我现在的问题是handleMessage函数看不到我创建的类和函数,而inizalize可以看到所有内容;我是编程的新手,也是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();
}
}

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

问题是在使用时,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变量,但它是函数中的局部变量,而不是类成员。Net::initialize()函数中的centralNode变量在任何其他成员函数(包括Net::handleMessage成员函数(中自然不可见。

有两种可能的解决方案。

选项1:在Net::handleMessage中创建一个局部变量

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

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

选项2:在Net类中创建一个数据成员

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

要打破这种循环依赖关系,可以向前声明Central_Node,并在Net类中使用指针:

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

一般意见

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

在这种情况下,Central_NodeNet(可能是"Network"(类继承似乎是错误的。传统上,继承用于表示"is-a"关系,说"Central_Node(或任何节点(是网络"是非常奇怪的。相反,节点(包括CentralNode(是网络的一部分,或者,网络包含节点。

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