2017-06-20 93 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)'。希望它能起作用 –