2014-02-19 102 views
0

我的比較函數依賴於Foo中的數據成員,因此我希望將它包含在此類中。所有的例子都使用全局函數,但它不是我想要的。我希望Foo的每個實例根據對象的當前狀態進行不同的比較。將比較函數傳遞給qsort C++

class Foo 
{ 
public: 
    Foo(){} 

    int Compare(const void * a,const void * b) 
    { 
    //Comparing logic 
    //This is fine 
    } 

    void SortStuff(void) 
    { 
    qsort(ObjectArray,MAXOBJECTS,sizeof(Object*), Compare); 
    }  

}; 
+13

幫你一個忙,並使用['std :: sort'](http://en.cppreference.com/w/cpp/algorithm/sort)。它使這種事情變得微不足道。 – juanchopanza

+0

這甚至不應該編譯。 'qsort'不能接受指向非靜態成員函數的指針。 – Brian

+0

...並實施運營商<您的比較。 – jbruni

回答

1

正如在評論中提到@juanchopanza,強烈建議您在C使用std::sort超過qsort ++。 std::sort算法可以正確調用賦值運算符,並且是類型安全的,而qsort不會。例如,如果您嘗試使用qsortstd::string s的數組進行排序,則會出現未定義的行爲。

也就是說,如果您絕對必須使用qsort這種方式,您遇到的問題是「隱形this」指針。在C++中,成員函數與自由函數有着根本的區別,因爲爲了調用成員函數,您需要提供一個接收器對象。在你上面寫的代碼中,你會得到一個錯誤,因爲qsort需要一個可以用兩個參數調用的自由函數,但是你給了它一個需要兩個參數的成員函數,這實際上真的需要三個參數 - 一個接收器對象和兩個指針。

要解決這個問題,你有幾個選擇。一種選擇是標記函數static,指示它是一個在你的類中的自由函數而不是成員函數。另一個選擇是使用lambdas來定義比較函數,因爲沒有捕獲列表的C++ lambda是自由函數。實際上,我建議在第一個選項中使用第二個選項,除非您需要在多個地方使用比較功能,因爲它更清楚地表明您只需要將該功能作爲一次性使用。