2016-05-16 48 views
-3

我想排序類指針的雙引擎取決於我的重載運算符<,但排序無法正常工作。C++重載運算符的類指針的排隊<

程序顯示這樣的:

Suit: 1 Number: 1 
Suit: 1 Number: 2 
... 
Suit: 1 Number: 13 
Suit: 2 Number: 1 
... 

但排序後它應該是這樣的:

Suit: 1 Number: 2 
Suit: 1 Number: 3 
... 
Suit: 1 Number: 13 
Suit: 1 Number: 1 
Suit: 2 Number: 2 
... 

這裏是我的代碼:

class CCard 
{ 
private: 
    int m_suit; 
    int m_number; 
public: 
    CCard(int suit, int number) : m_suit(suit), m_number(number) {} 
ostream& Output(ostream& toStream) 
{ 
    return toStream<<"Suit: "<<m_suit<<" Number: "<<m_number<<endl; 
} 
    bool operator < (const CCard *card)const 
    { 
     if(m_suit < card->m_suit) { return true; } 
     else if(m_suit > card->m_suit) { return false; } 
     else 
     { 
      if(m_number == card->m_number) { return false; } 
      else 
      { 
       if(m_number == 1) { return false; } 
       else if(card->m_number == 1) { return true; } 
       else { return m_number < card->m_number; } 
      } 
     } 
    } 
}; 

int main() 
{ 
    deque<CCard*> test; 
    for(int i = 1; i <= 4; i++) 
    { 
     for(int j = 1; j <= 13; j++) 
     { 
      test.push_back(new CCard(i,j)); 
     } 
    } 
    sort(test.begin(),test.end()); 
    for(deque<CCard*>::iterator it = test.begin(); it != test.end(); ++it) 
    { 
     (*it)->Output(cout); 
    } 
    system("pause"); 
    return 0; 
} 

任何想法將是有益的。

+6

你爲什麼使用指針?只需使用'std :: deque '並擺脫使用'new'。你可能來自Java背景嗎? – NathanOliver

+1

「aaaaaaaaaa」呢?是你的輸出的一部分還是你故意降低質量? –

+1

@MarcusMüller大概是對自動代碼防止問題進行黑客攻擊。 –

回答

2

您正在對指針數組進行排序,因此編譯器使用指針的內置比較 - 因此您最終按地址順序進行排序。

您的班級中的operator <被忽略,因爲您沒有排序對象。 (如果你還是不行的話,因爲你已經定義瞭如何比較一個物體與指針,而不是物體與物體的比較。)

要做的最好的事情是定義一個合適的排序(bool operator < (const CCard & card) const )和排序對象,如@NathanOliver建議。

如果你真的想排序指針,你將不得不編寫一個函數來比較兩個指針,並明確地將其傳遞給sort