2017-06-20 142 views
0

我想使用基于Omnet ++的容器cQueue作为优先级队列。
正如在API参考和说明书中介绍的 - 我需要定义它
如下:
cQueue queue("Name of queue", someCompareFunc)如何在Omnet ++中实现cQueue作为优先级队列?

someCompareFuncCompareFunc类型是由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); 

这一次我的错误是:
这行
“多重标记 - 这种情况下
内 - 从“诠释(的jobscheduler :: )(omnetpp转换: :CObject的,omnetpp :: CObject的*)”到 'omnetpp :: CompareFunc {又名INT() (omnetpp :: CObject的,omnetpp :: CObject的*)}'[-Wpmf-转换]”

'和号'之后加上括号也没有帮助。

如果我可以使用Omnet的这种方法,我想我会错过一些东西,因为它是软件的一个明确定义的“特征”,这真的很有帮助。
我也尝试谷歌这些主题,在谷歌组搜索部分,并没有找到任何答案。
将不胜感激

回答

1

尝试声明一个比较方法为静态。 例如:

//... 
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); 
    // ... 
} 
+0

谢谢!此解决方案有效。我还需要队列为全局的 ,因为它被几个函数使用。因此,我在initialize()函数内定义了一个全局cQueue *, 并赋给它'new cQueue(“name”,method)'。希望它能起作用 –