2011-02-09 2 views
1

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

Я могу показать одну карту, делая это:

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; 
} 

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

+0

Где перегруженное OStream Определения для игрока? –

+0

Я не вижу, чтобы оператор << определялся для игрока. Это должно привести к ошибке компиляции. Можете ли вы добавить свою реализацию оператора << для игрока? – Patrick

+0

Вы определили 'operator << (std :: ostream &, Card)', поэтому вы четко знаете ho, чтобы сделать это, но вы, похоже, даже не пытались определить выход 'operator << (ostream &, const Player &), ; ' –

ответ

3
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

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

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

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

+1

Почти справа. Игрок должен быть передан через ссылку. –

+0

Upssss. Сожалею. Исправлена. –

1

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

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

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

1

Вам нужно определить оператор < < для вашего класса игрока, а также вашего класс карты

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

Почти справа. Игрок должен быть передан через ссылку. –

+0

@Jan Hudec, вот что я получаю для копирования/вставки кода OP. копия/вставка плохой !! – Glen

+1

@Jan: Игроку не нужно передавать по ссылке (но это должно быть по соображениям производительности). Тем не менее, ostream следует передавать по ссылке. –

Смежные вопросы