handleMessage看不到我的类和函数
handleMessage doesnt see my classes and functions
我正在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_Node
从Net
(可能是"Network"(类继承似乎是错误的。传统上,继承用于表示"is-a"关系,说"Central_Node(或任何节点(是网络"是非常奇怪的。相反,节点(包括CentralNode(是网络的一部分,或者,网络包含节点。
除此之外,我认为Central_Node:: addTimeStamp()
成员函数中存在一个错误,因为数组数据成员从未初始化。我怀疑,正如所写的那样,这将在运行时导致segfault或其他崩溃。
- 为什么我的删除节点函数实际上没有删除节点?
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 模板,函数使用错误的构造函数来复制我的对象
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 为什么我的数组双精度函数不起作用?
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 为什么我的双向链表删除函数会删除多个节点?
- 为什么在我的 main 函数中声明整数后我的整数数组中会出现错误?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- 为什么我的 while 函数没有终止?
- 为什么我的 constexpr 对象在我的函数中不是 constexpr?
- 我关于函数"Assert"的C++代码有问题
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 链表堆栈类的复制构造函数:我的正在向后复制
- 为什么在这种情况下没有调用复制构造函数-我的推理正确吗?