Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ handleMessage看不到我的类和函数_C++_Omnet++ - Fatal编程技术网

C++ handleMessage看不到我的类和函数

C++ handleMessage看不到我的类和函数,c++,omnet++,C++,Omnet++,我正在用omnet++编写这段代码,它应该每次从不同的节点向一个中心节点发送消息。我现在的问题是handleMessage函数看不到我创建的类和函数,而Innizalize可以看到一切;对于编程和新手来说,我是一个新的C++语言: 代码: 我得到的错误是:在simtime\t ArrivalTime=centralNode.addTimeStamp()行上使用了未声明的标识符'centralNode'问题在于,在使用时,centralNode不是定义的变量: void Net::handleMe

我正在用omnet++编写这段代码,它应该每次从不同的节点向一个中心节点发送消息。我现在的问题是handleMessage函数看不到我创建的类和函数,而Innizalize可以看到一切;对于编程和新手来说,我是一个新的C++语言: 代码:


我得到的错误是:
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;
    [...]
};