Помощь в отображении вектора в int main () - PullRequest
1 голос
/ 09 февраля 2011

Программа, которую я написал, создает колоду карт, которая может быть перетасована, и игрок, который берет четыре карты и кладет их в соответствующие столбцы.

Я могу отобразить одну карту, выполнив это:

int main()
{
    Card card;
    cout << card << endl;
}

Проблема в том, что я хочу отобразить свой класс игрока, который состоит из вектора карт и должен отобразить четыре карты и поместить их в четыре отдельных столбца. Но используя это:

int main()
{
    Deck deck;
    deck.shuffle();

    Player player;
    cout << player;
}

ничего не отображает, фактически выдает ошибку.

Как правильно отобразить мои четыре карты в соответствующих четырех столбцах?

Кроме того, вот весь код, который у меня есть, на случай, если вы захотите пройти его самостоятельно:

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

enum suits 
{
    diamond, club, heart, spade
};

class Card
{
private:
    int rank;
    suits suit;
public:
    Card();
    Card(suits, int);
    int getRank() { return rank; }
    suits getSuit() { return suit; }
    void setRank(int rankvalue) { rank = rankvalue; }
    void setSuit(suits suitvalue) { suit = suitvalue; }
};

ostream & operator<<(ostream &, Card);

Card::Card()
{
    rank = 1;
    suit = spade;
}

Card::Card(suits suitvalue, int rankvalue)
{
    rank = rankvalue;
    suit = suitvalue;
}

ostream & operator<<(ostream & out, Card aCard)
{
    switch (int rank = aCard.getRank())
    {
        case 1: out << "Ace"; break;
        case 11: out << "Jack"; break;
        case 12: out << "Queen"; break;
        case 13: out << "King"; break;
        default: out << rank;
    }

    switch (suits suit = aCard.getSuit())
    {
        case diamond: out << " of Diamonds"; break;
        case spade: out << " of Spades"; break;
        case heart: out << " of Hearts"; break;
        case club: out << " of Clubs"; break;
    }

    return out;
}

class RandomInteger 
{
public: 
    RandomInteger();
    unsigned int operator() (unsigned int max);
};

RandomInteger::RandomInteger()
{
    srand(time(0));
}

unsigned int RandomInteger::operator()(unsigned int max)

{
    unsigned int rval = rand();
    return rval % max;
}

RandomInteger randomizer;

class Deck
{
    Card cards[52];
    int topCard;
public:
    Deck();
    void shuffle();
    bool isEmpty() { return topCard <= 0; }
    Card draw();
};

extern RandomInteger randomizer;

Deck::Deck()
{
    topCard = 0;
    for (int i = 1; i <= 13; i++)
    {
        Card c1(diamond, i), c2(spade, i), c3(heart, i), c4(club, i);
        cards[topCard++] = c1;
        cards[topCard++] = c2;
        cards[topCard++] = c3;
        cards[topCard++] = c4;
    }
}

Card Deck::draw()
{
    if (!isEmpty())
        return cards[--topCard];
    else
    {
        Card spadeAce(spade, 1);
        return spadeAce;
    }
}

void Deck::shuffle()
{
    random_shuffle(cards, cards+52, randomizer);
}

class Player
{
public:
    Player();
    void print();
    Card draw(Deck &);
    typedef vector<Card> cards;
    vector<cards> column;
};

Player::Player()
{
    column.push_back(vector<Card>());
    column.push_back(vector<Card>());
    column.push_back(vector<Card>());
    column.push_back(vector<Card>());
}

Card Player::draw(Deck & aDeck)
{
    for (int i = 0; i < 4; i++)
        column[i].push_back(aDeck.draw());
}

void Player::print()
{
    cout << "Col 1 \t Col 2 \t Col 3 \t Col 4 \n";
    bool more = true;
    for (int j = 0; more; j++)
    {
        more = false;
        for (int i = 0; i < 4; i++)
            if (j < column[i].size())
        {
        cout << column[i][j] << "\t";
        more = true;
        }
            else
            cout << "\t\t";
    cout << endl;
    }
}

int main()
{
    Deck deck;
    deck.shuffle();

    Player player;
    while (!deck.isEmpty());
    cout << player;
}

Извините за любительский вопрос, я знаю, что это что-то простое, и спасибо заранее.

Ответы [ 4 ]

3 голосов
/ 09 февраля 2011
cout << player;

Это не будет работать, потому что вы не перегружены operator<< для типа Player.Пожалуйста, сначала реализуйте это:

ostream & operator<<(ostream &out, const Player & player)
{
    //your implementation
}

Если ему нужен доступ к личным членам, то сделайте это friend из Player.


Я только что заметил, что ваш класс Player имеет функцию с именем print, может быть, вы хотели бы вызвать ее с operator<<().Если вы вызываете его, то я бы предложил вам использовать следующую сигнатуру функции:

   void print(ostream &out) const 
   {
        //use `out`, instead of `cout` now!
   }

, а затем вызвать ее из operator<<, как:

ostream & operator<<(ostream &out, const Player & player)
{
    player.print(out);
    return out; 
}

Преимуществоэтой реализации является то, что вы можете выводить на консоль, а также файл также .

1 голос
/ 09 февраля 2011

Вам необходимо определить оператор << для вашего класса Player, а также для класса вашей карты </p>

ostream & operator<<(ostream & out, Player& aPlayer) {
    //print out each card in turn
    out << "Col 1 \t Col 2 \t Col 3 \t Col 4 \n";
    bool more = true;
    for (int j = 0; more; j++)
    {
        more = false;
        for (int i = 0; i < 4; i++)
            if (j < aPlayer.column[i].size())
        {
        out << aPlayer.column[i][j] << "\t";
        more = true;
    }
    else
        out << "\t\t";
     out << endl;
     return out;
}
1 голос
/ 09 февраля 2011

Ну, первый вызов работает из-за кода "вы написали" здесь:

ostream & operator<<(ostream &, Card);

во втором классе игрока "вы написали" класс печати. Так что я предполагаю, что вы можете просто позвонить player.print(). Но я не просмотрела печать, чтобы проверить, работает ли она.

1 голос
/ 09 февраля 2011

Вам необходимо реализовать перегруженный оператор «<<» для <code>Player:

ostream & operator<<(ostream &, Player&);

для вывода соответствующей информации точно так, как это было сделано для Card класса.

...