一个面向对象设计的考试题,怎么建模一副扑克牌

一个面向对象设计的考试题,如何建模一副扑克牌
去掉王,剩下52张,写一个类,实现洗牌,发牌的功能

注意洗牌要能把牌洗得随机,

下面是我的简单的思路,0-51表示牌

class cards
{
public:
  void shuffle()
  {
  for(int i=0;i<52; i++)
m_cards.push_back(i); 
  }
  int send()
  {
if(m_cards.size()==0)
return -1;
else if(m_cards.size()==1)
{  
int tmp=m_cards.back();
m_cards.pop_back();
return tmp;
}
else
{
int tmpIndex=rand()%m_cards.size();
int tmp=m_cards[tmpIndex];
m_cards.erase(m_cards.begin()+tmpIndex);
return tmp;
}
  }
private:
std::vector<int> m_cards;
};

感觉应该有更好的解决方案,怎么样才能更OO?

------解决方案--------------------
C/C++ code

enum Suit
{
    Spade = 0,
    Heart,
    Diamond,
    Club
};

class Poker
{
private:
    Suit m_suit;
    int m_number;
public:
    Poker(Suit suit,int number)
    {
        m_suit = suit;
        m_number = number;
    }

    string GetSuit()
    {
        string suit = "Spade";
        if(m_suit == Heart)
            suit = "Heart";
        if(m_suit == Diamond)
            suit = "Diamond";
        if(m_suit == Club)
            suit = "Club";
        return suit;
    }
    
    friend ostream& operator <<(ostream& os, Poker* pk)
    {
        string suit = pk->GetSuit();
        os << "[" << suit.c_str() << ":" << pk->m_number << "]";
        return os;
    }
};

class Cards
{
private:
    vector<Poker*> m_cards;
public:
    Cards()
    {
        for(int i = 0 ; i < 52 ; i++)
        {
            m_cards.push_back(new Poker((Suit)(i / 13), (i % 13)+1));
        }
    }
    void Output()
    {
        vector<Poker*>::iterator iter = m_cards.begin();
        for(; iter != m_cards.end() ; iter++)
        {
            cout<<(Poker*)(*iter)<<endl;
        }
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    Cards *cards  = new Cards();
    cards->Output();
    int a = 0;
    a = cin.get();
    return 0;
}

------解决方案--------------------
改进了一下。。。顶楼上
C/C++ code
#include <iostream>
#include <string>
#include <vector>
using namespace std;
enum Suit
{
    Spade = 0,
    Heart,
    Diamond,
    Club
};

class Poker
{
private:
    Suit m_suit;
    int m_number;
public:
    Poker(Suit suit,int number)
    {
        m_suit = suit;
        m_number = number;
    }

    string GetSuit()
    {
        string suit = "Spade";
        if(m_suit == Heart)
            suit = "Heart";
        if(m_suit == Diamond)
            suit = "Diamond";
        if(m_suit == Club)
            suit = "Club";
        return suit;
    }
    
    friend ostream& operator <<(ostream& os, Poker* pk)
    {
        string suit = pk->GetSuit();
        os << "[" << suit.c_str() << ":" << pk->m_number << "]";
        return os;
    }
};

class Cards
{
private:
    vector<Poker*> m_cards;
public:
    Cards()
    {
        for(int i = 0 ; i < 52 ; i++)
        {
            m_cards.push_back(new Poker((Suit)(i / 13), (i % 13)+1));
        }
        left = 52;
    }
    void Output()
    {
        iter = m_cards.begin();
        for(; iter != m_cards.end() ; iter++)
        {
            cout<<(Poker*)(*iter)<<endl;
        }
    }
    void GetACard()
    {
         srand( (unsigned)time(NULL)); 
         int index=rand()%left; 
         iter = m_cards.begin();
         Poker *p=m_cards[index];
         m_cards.erase(iter+index);
         cout<<(Poker*)(p)<<endl;  
         left--;
    }
    private:
    vector<Poker*>::iterator iter;
    unsigned int left ;
};

int main(int argc, char* argv[])
{
    Cards *cards  = new Cards();
   // cards->Output();
    int i=52;
     while(i--)
     {
       cout<<i<<":";
       cards->GetACard();     
     }
    system("pause");
    return 0;
}