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()
成员函数中存在错误,因为数组数据成员从未被初始化。我怀疑,如所写,这会在运行时导致段错误或其他崩溃。
我正在用 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()
成员函数中存在错误,因为数组数据成员从未被初始化。我怀疑,如所写,这会在运行时导致段错误或其他崩溃。