2011-02-09 4 views
1

Le programme que j'ai écrit crée un jeu de cartes qui peut être mélangé et un joueur qui prend quatre cartes et les met dans les colonnes correspondantes.Aide Affichage d'un vecteur dans int main()

Je peux afficher une seule carte en faisant ceci:

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

Le problème est, je veux montrer ma classe de joueur, qui est composé d'un vecteur de cartes et devrait afficher quatre cartes et les mettre en quatre colonnes distinctes. Mais en utilisant ceci:

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

    Player player; 
    cout << player; 
} 

n'affiche rien, en fait, cela me donne une erreur.

Comment puis-je afficher correctement mes quatre cartes dans les quatre colonnes correspondantes?

Aussi, voici le code entier je jusqu'à présent, si vous voulez passer par vous-même:

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

Désolé pour la question amateur, je sais que c'est quelque chose de simple, et merci à l'avance.

+0

Où est la ostream Définition Surchargé pour le joueur? –

+0

Je ne vois pas l'opérateur << étant défini pour Player. Cela devrait provoquer une erreur de compilation. Pouvez-vous ajouter votre implémentation de l'opérateur << pour Player? – Patrick

+0

Vous avez défini 'operator << (std :: ostream &, Card)', donc vous savez clairement ho pour le faire, mais vous n'avez même pas essayé de définir la sortie 'operator << (ostream &, const Player &) ; ' –

Répondre

3
cout << player; 

Cela ne fonctionne pas, parce que vous ne l'avez pas surchargé operator<< pour le type Player. S'il vous plaît d'abord mettre en œuvre ceci:

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

Si elle a besoin d'accéder à des membres privés, puis en font friend de Player.


Je viens de remarquer que votre classe Player a une fonction appelée print, peut-être vous appeler à partir operator<<(). Si vous l'appelez, je vous suggère d'utiliser la signature de la fonction suivante:

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

Et puis appeler cela de operator<<, comme:

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

L'avantage de cette mise en œuvre est que vous pouvez produire à la console ainsi que le fichier également.

1

Vous devez mettre en œuvre l'opérateur surchargé « < < » pour Player:

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

pour produire les informations pertinentes exactement comme cela a été fait pour Card classe.

+1

Presque à droite. Le joueur doit être passé par référence. –

+0

Upssss. Pardon. Fixé. –

1

Eh bien, le premier appel fonctionne en raison du code « vous avez écrit » ici:

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

dans le deuxième joueur de classe « vous avez écrit » une classe d'impression. Donc je suppose que vous pouvez simplement appeler player.print(). Mais je n'ai pas fait d'impression pour voir si ça fonctionne.

1

Vous devez définir un opérateur < < pour votre classe de joueur ainsi que votre classe de carte

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

Presque à droite. Le joueur doit être passé par référence. –

+0

@Jan Hudec, c'est ce que je reçois pour copier/coller le code OP. copier/coller mauvais !! – Glen

+1

@Jan: Le joueur ne doit pas être passé par référence (mais cela doit être pour des raisons de performance). L'ostream doit être passé par référence cependant. –

Questions connexes