我正在使用基于C ++的Omnet ++进行网络模拟。我正在尝试使用以下代码为某个模块定义一个类:
#ifndef __PROJECT_IMS_SLF_H_
#define __PROJECT_IMS_SLF_H_
#include <omnetpp.h>
#include "mDIAMETER_m.h"
#include "IPPacket_m.h"
class SLF : public cSimpleModule
{
public:
mDIAMETER *generateDIAMETERmsg(const char* name, long userID, bool registered, std::string server);
IPPacket *generateIPPacket(int srcIP,int desIP);
protected:
virtual void initialize();
virtual void handleMessage(cMessage *msg);
private:
int MyIP;
int N = par("N");
struct Registry {
long UserID;
bool Registered;
std::string Server;
};
struct Registry MyReg[N]; // Create a Registry Table for all UEs
};
#endif
我收到以下错误:&#34;无效使用非静态数据成员SLF :: N&#34;。我知道我在类定义中将N声明为私有变量,但我必须这样做,因为N是与模块相关的参数,它被定义为类SLF的一个实例,并且从配置中读取该模块使用OMNET ++定义的函数&#34; par&#34;。
如果我在initialize函数中声明MyReg[N]
它可以工作,但问题是我需要在另一个函数(handleMessage
)中使用这个变量。任何提示?
提前致谢!
答案 0 :(得分:1)
在堆上分配数组:
class SLF /* etc. */
{
/* etc. */
virtual void initialize()
{
/* etc. */
N = par("N");
MyReg = new Registry[N];
/* etc. */
}
/* etc. */
int N;
/* etc. */
struct Registry *MyReg;
}
请务必删除析构函数中的内存。
答案 1 :(得分:0)
问题解决如下:
struct Registry *MyReg;
现在在模块内部,在initialize函数中,可以读取N并且可以使用其大小声明结构的实例:
int N = par("N");
this->MyReg = new struct Registry[N];
我还在头文件中定义了一个完成模块,并在该函数中删除了MyReg。