我想使用基于Omnet ++的容器cQueue
作为优先级队列。
正如API参考和手册中所述-我需要对其进行定义
如下:cQueue queue("Name of queue", someCompareFunc)
当someCompareFunc
的类型为CompareFunc
时,omnet将其定义为:typedef int (*CompareFunc)(cObject *a, cObject *b);
因此,我想实现此比较功能,但没有设法编写可编译的东西。
我承认我已经有一段时间没有使用函数指针了,但是经过一番研究,我认为我确实理解并使用eclipse IDE(c ++)编写了一些测试代码。
我正在尝试在simpleModule
file.cc上编写代码。
因此,对于我以“常规方式”在头文件中声明的每个函数,在.cc文件中,我需要在函数名称之前添加带有“ ::”的模块名称。
所以我在头文件中声明:int compareByNodes (cObject *a, cObject *b);
在.cc文件中:
int JobScheduler::compareByNodes (cObject *a, cObject *b){
return 1;
};
我第一次定义cQueue的尝试是:
cQueue queue("job_Buffer",&compareByNodes);
但是我收到一个编译错误:'compareByNodes'未在此范围内声明。
因此,我认为它必须与缺少的“ JobScheduler ::”有关。
第二次尝试是:
CompareFunc tmp = (CompareFunc)&JobScheduler::compareByNodes;
cQueue queue("job_Buffer",tmp);
这次我的错误是:
“这条线上有多个标记
-在这种情况下
-从“ int(JobScheduler ::)(omnetpp :: cObject,omnetpp :: cObject *)”转换为“ omnetpp :: CompareFunc {aka int()
(omnetpp :: cObject,omnetpp :: cObject *)}’[-Wpmf-conversions]“
在“&”号后面加上括号也无济于事。
如果我可以使用Omnet的这种方法,那真的很有帮助,我想我遗漏了一些东西,因为它是该软件定义明确的“功能”。
我还尝试过搜索这些主题,在Google网上论坛部分中进行了搜索,但未找到任何答案。
希望有帮助
最佳答案
尝试将比较方法声明为静态方法。
例如:
//...
class Txc1 : public cSimpleModule {
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
public:
static int MyCompareFunc (cObject *a, cObject *b);
};
Define_Module(Txc1);
int Txc1::MyCompareFunc (cObject *a, cObject *b) {
return 1;
}
void Txc1::initialize() {
cQueue q1("queue1", MyCompareFunc);
// ...
}