Hia, вы спрашивали о предложениях, поэтому я подумал, что я предлагаю пару вещей
Прежде всего мне нравится сохранять перечисляемые типы и функцию, которая возвращает строку, на всякий случай, если я добавлю к перечисляемомувведите позже (маловероятно, в данном случае, допустим)
class suits{
public:
enum type{
diamond, club, heart, spade,
};
static
std::string get_string(const type& t)
{
switch (t) {
case diamond: return"Diamonds";
case spade: return"Spades";
case heart: return"Hearts";
case club: return"Clubs";
}
throw("invalid suit"); //this is a bit ugly - but you get the idea
}
};
Затем вы обращаетесь к suits::spade
, suits::get_string(suits::spade)
и т. д., которые могут быть немного яснее.
Тогда я бы взял костюм ичисло в их собственных классах, то вы можете сделать сравнение здесь:
class CardSuit
{
private:
suits::type m_suit;
protected:
std::string get_string() const {return suits::get_string(m_suit);}
public:
CardSuit(const suits::type& t) : m_suit(t) {}
void setSuit(const suits::type& t) { m_suit = t;}
const suits::type& getSuit() const {return m_suit;}
bool operator<(CardSuit cs)
{
return m_suit<cs.getSuit(); //You must have the enum in the suit order
}
};
Затем
CardSuit club(suits::club);
CardSuit spade(suits::spade);
if (club<spade)
std::cout<<"true"<<std::endl;
else
std::cout<<"false"<<std::endl;
возвращает true
Затем вы можете наследовать от класса CardSuitнапример,
class Card : public CardSuit
{
private:
int rank;
public:
Card();
Card(suits::type, int);
int getRank() { return rank; }
void setRank(int rankvalue) { rank = rankvalue; }
std::string get_suit() const {return CardSuit::get_string();}
bool operator<(const Card& c)
{
if (CardSuit::operator<(c) )
return true;
if (rank<c.getRank())
return true;
else return false;
}
};
, так что
Card c1(suits::club, 4);
Card c2(suits::club, 5);
Card c3(suits::diamond, 5);
if (c2<c1)
std::cout<<"true"<<std::endl;
else
std::cout<<"false"<<std::endl;
if (c3<c1)
std::cout<<"true"<<std::endl;
else
std::cout<<"false"<<std::endl;
возвращает ложь и истину соответственно
Наконец, оператор utstream выглядит примерно так:
ostream & operator<<(ostream & out, Card aCard)
{
switch (int rank = aCard.getRank())
{
case 14: out << "Ace"; break;
case 11: out << "Jack"; break;
case 12: out << "Queen"; break;
case 13: out << "King"; break;
default: out << rank;
}
out << " of "<< aCard.get_suit();
return out;
}
(Iтакже сделает класс ранга похожим на класс CardSuit - в этом случае он будет еще более аккуратным).