C++ handleMessage看不到我的类和函数
我正在用omnet++编写这段代码,它应该每次从不同的节点向一个中心节点发送消息。我现在的问题是handleMessage函数看不到我创建的类和函数,而Innizalize可以看到一切;对于编程和新手来说,我是一个新的C++语言: 代码:C++ handleMessage看不到我的类和函数,c++,omnet++,C++,Omnet++,我正在用omnet++编写这段代码,它应该每次从不同的节点向一个中心节点发送消息。我现在的问题是handleMessage函数看不到我创建的类和函数,而Innizalize可以看到一切;对于编程和新手来说,我是一个新的C++语言: 代码: 我得到的错误是:在simtime\t ArrivalTime=centralNode.addTimeStamp()行上使用了未声明的标识符'centralNode'问题在于,在使用时,centralNode不是定义的变量: void Net::handleMe
我得到的错误是:
在simtime\t ArrivalTime=centralNode.addTimeStamp()行上使用了未声明的标识符'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()
函数一样。此中心节点
对象一旦超出范围将“消失”(被销毁)
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\u节点
数据成员,而CentralNode
类本身继承自Net
要打破这种循环依赖关系,您可以向前声明Central\u节点
,并在Net
类中使用指针:
class Central_Node; // Forward declaration
class Net : public cSimpleModule
{
// unique_ptr required to break circular dependency
std::unique_ptr<Central_Node> centralNode;
[...]
};
类中心节点;//远期申报
类Net:公共cSimpleModule
{
//打破循环依赖关系所需的唯一\u ptr
std::唯一的ptr中心节点;
[...]
};
一般性意见
通常,当代码表现出循环依赖时,这表明代码中表达的抽象或关系不是正确的
在这种情况下,Central_节点
继承自Net
(可能是“网络”)类似乎是错误的。继承通常用于表示“是-是”关系,说“中心节点(或任何节点)是网络”是非常奇怪的。相反,节点(包括中心节点)是网络的一部分,或者,网络包含节点
除此之外,我认为
Central\u Node::addTimeStamp()
成员函数中存在一个bug,因为数组数据成员从未初始化过。我怀疑,正如我写的那样,这将在运行时导致segfault或其他崩溃。您所说的“handleMessage函数没有看到我创建的类和函数”是什么意思?您具体观察到了什么让您这么说?您好,在“simtime_t ArrivalTime=centralNode.addTimeStamp();”行上写着“使用未声明的标识符‘centralNode’”,非常感谢您的回答;那么,我该如何改变传感器和centralnode类的依赖关系以使其工作呢?我怎样才能用可变的维度将时间戳向量化呢?最后,我不明白为什么Innizalize函数没有给我任何声明问题。至于时间戳向量,我建议只使用std::vector
作为Central\u Node
的成员,替换C样式的数组成员。如果您对如何初始化它或添加时间戳有疑问,您可能需要参考一个教程,该教程涵盖了std::vector
。您写道,您不理解为什么“initialize”函数在初始代码中没有给您带来问题。正如我所写的,原始代码在该函数中包含一个局部变量,然后使用该局部变量。它是有效的、可编译的代码,但它可能不会执行您希望它执行的操作(为类定义数据成员)。我将尝试添加关于重新组织依赖项的选项3。最后,如果这回答了您最初关于为什么代码不起作用的问题,您可以考虑使用UnQuyjpTR来从HoalLeMeSeaFunCon中使用的变量中获得错误,但是我从在我声明的类中创建的函数中得到了错误:在“STD::UnQuyjpTR”中没有成员名为“AddieTimePress”,并且在“STD::UnQuijpTR”中没有名为“DeleTeSigar”的成员,并且没有名为“SeNeMeST”的成员。'std::unique_ptr';您的意思是使用“->”而不是“.”吗?发生这些错误的原因是,如果您有指针变量,则需要将
的使用替换为->
来调用成员函数。这将全部在介绍性的C++教科书或教程中进行。我建议通过这样的教程,使这个项目的C++部分更容易一些。
class Central_Node; // Forward declaration
class Net : public cSimpleModule
{
// unique_ptr required to break circular dependency
std::unique_ptr<Central_Node> centralNode;
[...]
};