2010-11-26 47 views
4

如果你看看我的函数CardCompare里面的类...它不工作!但是,如果我使用Hand.cpp中注释掉的函数,它就可以很好地工作。为什么是这样?使用类内部的比较函数进行排序的问题()

此外,我想知道是否保持CardCompare函数在我的手类中比保持它在Card类中没有意义,如果可能的话。

Hand.h

#ifndef HAND_H 
#define HAND_H 

#include <vector> 
#include "Card.h" 

class Hand { 
    private: 
     std::vector<Card> hand; 
     int total; 
     void CalculateTotal(); 
     bool CardCompare (Card i, Card j) {return (i.RankInt() < j.RankInt()); }//Does not work! :O 
    public: 
     Hand() { 
      total = 0; 
     } 
     std::vector<Card> GetHand() const{ return hand;}; 
     void PrintHand(); 
     void AddToHand(Card c); 

}; 



#endif 

Hand.cpp

#include "Hand.h" 
#include <iostream> 
#include <algorithm> 

void Hand::CalculateTotal() { 
    for (int i = 0; i < hand.size(); i++) { 
      std::cout << hand[i].ToString() << std::endl; 
    } 
} 

void Hand::PrintHand() { 
    for (int i = 0; i < hand.size(); i++) { 
     std::cout << hand[i].ToString() << std::endl; 
    } 
    std::cout << std::endl; 
} 
/* If I place this right here, it works perfect. 
bool CardCompare (Card i, Card j) {return (i.RankInt() < j.RankInt()); } 
*/ 
void Hand::AddToHand(Card c) { 
    hand.push_back(c); 
    std::sort(hand.begin(),hand.end(),CardCompare); 
} 

int main() { 
    Hand h; 
    h.PrintHand(); 
    h.AddToHand(Card (2, (Card::Suit)2)); 
    h.PrintHand(); 
    h.AddToHand(Card (3, (Card::Suit)3)); 
    h.PrintHand(); 
    h.PrintHand(); 
    h.AddToHand(Card (1, (Card::Suit)2)); 
    h.PrintHand(); 
    h.AddToHand(Card (13, (Card::Suit)3)); 
    h.PrintHand(); 

    std::cout<< std::endl << std::endl; 

    std::cout << h.GetHand()[0].ToString(); 
} 

Card.h

#ifndef CARD_H 
#define CARD_H 

#include <string> 

class Card { 
public: 
    enum Suit { 
     SUIT_HEART, 
     SUIT_DIAMOND, 
     SUIT_CLUB, 
     SUIT_SPADE 
    }; 
    Card(int r = 1, Suit s = SUIT_HEART) : rank(r), suit(s) 
    {} 
    int GetRank() const { return rank; }; 
    Suit GetSuit() const { return suit; }; 
    std::string ToString() const; 
    std::string SuitString() const; 
    std::string RankString() const; 
    int RankInt() const; 


private: 
    int rank; 
    Suit suit; 
    static const char * ranknames[]; 
    static const char * suitnames[]; 
    static const int  rankints[]; 
}; 
#endif 

Card.cpp

#include <iostream> 
#include "Card.h" 
//#include <vector> //gtfo 

const char * Card::ranknames[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" }; 
const char * Card::suitnames[] = { "Hearts", "Diamonds", "Clubs", "Spaces" }; 
const int Card::rankints[] = {11, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,10 ,10, 10 }; 

std::string Card::ToString() const { 
    std::string s = RankString(); 
    s.append(" of "); 
    s.append(SuitString()); 
    return s; 
} 

std::string Card::SuitString() const { 
    return suitnames[suit]; 
} 

std::string Card::RankString() const { 
    return ranknames[rank-1]; 
} 

int Card::RankInt() const { 
    return rankints[rank-1]; 
} 
/* 
int main() { 

    std::vector<Card> Deck; 

    for (int i = 0; i < 10 ; i++) { 
     Deck.push_back(Card(i+1,(Card::Suit)((i+1)%4))); 
     std::cout << Deck[i].ToString() << std::endl; 
    } 

    std::cout << std::endl << std::endl; 
    std::random_shuffle(Deck.begin(), Deck.end()); 

    for (int i = 0; i < 10 ; i++) { 
      std::cout << Deck[i].ToString() << std::endl; 
    } 
}*/ 
+2

你可以在lea删除所有不相关的代码? – ybungalobill 2010-11-26 20:51:32

+0

对不起,我从现在开始做。 – Colton 2010-11-26 21:09:21

+0

个人喜好:不要将数字转换为`Card :: Suit`s,你应该拥有`Card :: Suit`的静态成员,称为`Spades`,`Hearts`,`Diamonds`和`Clubs`。 – 2010-11-26 21:13:47

回答

7

您试图将指针传递给成员函数,因此排序无法使用它,因为它没有this指针。你的情况,你可以只改变函数为static

static bool CardCompare (Card i, Card j) {return (i.RankInt() < j.RankInt()); } 

如果您还需要在未来的非静态成员函数,将其绑定与boost::bindstd::bind(对于C++ 0x中编译) :

std::sort(hand.begin(),hand.end(),bind(&Hand::CardCompare, this, _1, _2)); 
2

如果要在sort()中使用CardCompare(),则CardCompare()不能是成员函数。您可以将卡类中的运营商<超载以比较卡。

在卡类,类似:

bool operator<(const Card& other) const { 
    return RankInt() < other.RankInt(); 
} 
1

的典型的解决方案是重载operator()代替。这会将您的课程变成仿函数,然后使用标准库算法开箱即用。

只要改变

bool CardCompare (Card i, Card j) {return (i.RankInt() < j.RankInt()); } 

bool operator()(Card i, Card j) {return (i.RankInt() < j.RankInt()); } 

,然后你可以调用排序是这样的:

std::sort(hand.begin(),hand.end(), Hand()); 

通常情况下,你就会把比较运营商在一个单独的类虽然

相关问题