2011-11-23 56 views
1

我是C++的初學者,並且有關於排序類對象向量的問題。我在網上做了很多研究,但似乎無法找出答案。我的問題是,我想有多個謂詞比較函數,我可以命名,因爲我需要讓用戶能夠從菜單中選擇要排序的矢量的私有成員變量/分量。我可以通過重載操作符來獲得謂詞比較函數,但是當我嘗試命名該函數時,似乎無法在沒有大量錯誤的情況下編譯它(我將向後張貼更多在適當的代碼下面)。如何命名比較謂詞函數來排序向量

當代碼運行時,一個BookData對象的向量由讀取文本文件的函數創建。函數原型主:主

vector<BookData> createVector(); 

函數調用:

vector<BookData> books = createVector(); 

createVector函數定義:

vector<BookData> createVector() 
{ 
    const int LENGTH = 81; 
    char input[LENGTH]; 
    vector<BookData> fBooks; 
    string vBookTitle, vIsbn, vAuthor, vPublisher, vDateAdded; 
    int vQtyOnHand; 
    double vWholesale, vRetail; 
    BookData *books1; 
    books1 = new BookData; 
    fstream dataFile("Serendipity.data"); 
    if (dataFile.is_open()) 
    { 
     while (!dataFile.eof()) 
     { 
      dataFile.getline(input, LENGTH, '\t'); 
      vBookTitle = input; 
      books1->setTitle(vBookTitle); 
      dataFile.getline(input, LENGTH, '\t'); 
      vAuthor = input; 
      books1->setAuthor(vAuthor); 
      dataFile.getline(input, LENGTH, '\t'); 
      vPublisher = input; 
      books1->setPub(vPublisher); 
      dataFile.getline(input, LENGTH, '\t'); 
      vIsbn = input; 
      books1->setIsbn(vIsbn); 
      dataFile >> vQtyOnHand; 
      books1->setQty(vQtyOnHand); 
      dataFile >> vWholesale; 
      books1->setWholesale(vWholesale); 
      dataFile >> vRetail; 
      books1->setRetail(vRetail); 
      dataFile.ignore(); 
      dataFile.getline(input, LENGTH); 
      vDateAdded = input; 
      books1->setDateAdded(vDateAdded); 
      fBooks.push_back(*books1); 
     } 
    } 
    return fBooks; 
} 

這是我的類定義文件(bookdata.h)與工作比較功能:

class BookData 
{ 
private: 
     string bookTitle, isbn, author, 
      publisher, dateAdded; 
     int qtyOnHand; 
     double wholesale, retail; 
     bool empty;  

public: 
    BookData(); 
    bool operator< (BookData rhs); 
    void printVector(); 
    void setTitle(string); 
    void setIsbn(string); 
    void setAuthor(string); 
    void setPub(string); 
    void setDateAdded(string); 
    void setQty(int); 
    void setWholesale(double); 
    void setRetail(double); 
    int isEmpty(); 
    void insertBook(); 
    void removeBook(); 
    string getTitle(); 
    string getIsbn(); 
    string getAuthor(); 
    string getPublisher(); 
    string getDateAdded(); 
    int getQtyOnHand(); 
    double getWholesale(); 
    double getRetail(); 
}; 

而且這是在類實現文件的工作函數(bookdata.cpp):

bool BookData::operator< (BookData rhs) 
{ 
    return qtyOnHand < rhs.qtyOnHand; 
} 

,這就是所謂像這樣從int main()中:

sort (books.begin(), books.end()); 

但是,如果我嘗試和名稱功能:

bool compare (BookData rhs); 

從類定義文件中,並在類實現文件改成這樣:

bool BookData::compare (BookData rhs) 
{ 
    return qtyOnHand < rhs.qtyOnHand; 
} 

並在主要改變矢量排序功能,所以:

sort (books.begin(), books.end(), &BookData::compare); 

我從編譯器收到一條錯誤消息:

錯誤C2064:術語不計算爲服用2個參數

功能

有關我如何正確地命名/調用排序功能的任何建議?

+0

一個合適的名字也許應該表明它是比較量在手,沒有別的東西。 - 由數量? - >'排序(books.begin(),books.end(),byQuantity)' – UncleBens

+0

@ UncleBens-你是絕對正確的,這只是一個測試功能。一旦我把它們弄對了,我就會把它們改成更具描述性的名字。 –

回答

1

Compare不應該是類的成員(或者是static構件或friend如果它訪問受限場),並且應當接受這兩個值進行比較(而operator <使用this作爲左值)。

是這樣的:

bool compare (BookData lhs, BookData rhs) 
{ 
    return lhs.qtyOnHand < rhs.qtyOnHand; 
} 

使用operator<恕我直言,是更好的方法。

+0

@ littleadv-但是那麼我如何命名函數並在函數原型和定義中使用'operator <'?這就是我遇到問題的地方。 –

+0

沒關係,我把你的建議放在課堂上,並且完美地工作。謝謝!不得不改變功能實現通過使用吸氣函數來訪問私有類成員,雖然:'布爾sortByQty(BookData LHS,BookData右軸) { 返回lhs.getQtyOnHand()

0

順便說一句,建議通過按引用代替爲參數傳遞按值,如下所示:

bool compare (const BookData &lhs, const BookData &rhs) 
{ 
    // implementation. 
} 
+0

你能告訴我爲什麼通過常量引用比值更好? –

+0

當我這樣做時,我得到一個錯誤'對象有與成員函數不兼容的類型錯誤.' –

0

我建議創建一個斷言作爲功能對象:

struct compare 
{ 
    bool operator()(const BookData& x, const BookData& y) const 
    { 
     return x < y; 
    } 
}; 

請注意operator()末尾的const

sort (books.begin(), books.end(), compare()); 

如果你不想創建函數對象每次,你可以把它作爲在BookData(靜態)成員:您可以通過以下這個對象傳遞給STL算法。