2013-08-24 2 views
0

Je souhaite créer une classe appelée Deck sur une classe de Cards. Cependant, chaque fois que j'essaie de voir ce que j'ai mis dans mon Deck, j'obtiens une erreur qui indique Segmentation fault (core dumped). Comment puis-je réparer cela? J'ai lu d'autres questions que mon programme pourrait essayer d'accéder à la mémoire qui n'a pas été allouée, mais je ne sais pas où cela se produit. Voici le code que j'ai écrit:Défaut de segmentation (core dumped) en classe de pont C++

deck.h.:

#ifndef DECK_H 
#define DECK_H 

#include <vector> 

#include "card.h" 

class Deck 
{ 

    friend ostream &operator<<(ostream &, Deck &); 

    public: 
      Deck(); 

      void shuffle(); 

    private: 

      vector<Card> myDeck; 
}; 

#endif 

Deck.cpp

#include <iostream> 
#include <vector> 
#include <string> 
#include <cstdlib> 

#include "deck.h" 
#include "card.h" 

Deck::Deck() 
{ 

    for(int i = 1; i <= 4; i++) 
    { 
      for(int j = 1; j <= 13; j++) 
      { 
        Card myCard(j,i); 
        myDeck.push_back(myCard); 
      } 
    } 
} 

void Deck::shuffle() 
{ 
    for(int i = 0; i < 52; i++) 
    { 
      Card temp(1,1); 
      int swapID = rand() % 52; 

      temp = this->myDeck[i]; 
      this->myDeck[i] = this->myDeck[swapID]; 
      this->myDeck[swapID] = temp; 
    } 
} 

ostream &operator<<(ostream &output, Deck &theDeck) 
{ 
    for(int i = 0; i < 52; i++) 
    { 
      cout << theDeck.myDeck[i]; 
    } 
} 

card.h:

#ifndef CARDS_H 
#define CARDS_H 

#include <string> 

using namespace std; 

class Card { 

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

    public: 
      Card(int face, int suit); 

      void showCard(); 

    private: 

      string face; 
      string suit; 

      void processFace(int value); 
      void processSuit(int suit); 
}; 

#endif 

card.cpp:

#include <iostream> 
#include <string> 

#include "card.h" 

using namespace std; 

Card::Card(int face, int suit) 
{ 
processFace(face); 
processSuit(suit); 

cout << "New card created" << endl; 
} 

void Card::showCard() 
{ 
cout << "This is the " << this->face << " of " << this->suit << endl; 
} 

void Card::processFace(int value) 
{ 

    switch(value) 
    { 
    case 1: 
    { 
     face = "Ace"; 
     break; 
    } 
    case 2: 
    { 
     face = "2"; 
     break; 
    } 
    case 3: 
    { 
     face = "3"; 
     break; 
    } 
    case 4: 
    { 
     face = "4"; 
     break; 
    } 
    case 5: 
    { 
     face = "5"; 
     break; 
    } 
    case 6: 
    { 
     face = "6"; 
     break; 
    } 
    case 7: 
    { 
     face = "8"; 
     break; 
    } 
    case 9: 
    { 
     face = "9"; 
     break; 
    } 
    case 10: 
    { 
     face = "10"; 
     break; 
    } 
    case 11: 
    { 
     face = "Jack"; 
     break; 
    } 
    case 12: 
    { 
     face = "Queen"; 
     break; 
    } 
    case 13: 
    { 
     face = "King"; 
     break; 
    } 
} 
} 

void Card::processSuit(int decider) 
{ 
switch(decider) 
{ 
    case 1: 
    { 
     suit = "Hearts"; 
     break; 
    } 
    case 2: 
    { 
     suit = "Diamonds"; 
     break; 
    } 
    case 3: 
    { 
     suit = "Clubs"; 
     break; 
    } 
    case 4: 
    { 
     suit = "Spades"; 
     break; 
    } 
} 
} 


ostream &operator<<(ostream &output, Card &myCard) 
{ 
output << myCard.face << " of " << myCard.suit << endl; 
} 

main.cpp:

#include <iostream> 
#include <string> 
#include <vector> 

#include "card.h" 
#include "deck.h" 

using namespace std; 

int main() 
{ 

    Deck mainDeck; 

    cout << mainDeck << endl << endl; 

} 
+1

manière sûre est vérifier swapID généré avant l'index –

+2

Veuillez également publier les fichiers d'en-tête. –

+0

Et la définition de type 'Card'. –

Répondre

6

Votre méthode

ostream &operator<<(ostream &output, Deck &theDeck) 
{ 
    for(int i = 0; i < 52; i++) 
    { 
      cout << theDeck.myDeck[i]; 
    } 
} 

doit retourner ostream&, mais il ne met rien à revenir. En outre, vous devez appeler operator<< sur output et non sur le cout (vous passerez cout à cette méthode):

ostream &operator<<(ostream &output, const Deck &theDeck) 
{ 
    for(int i = 0; i < 52; i++) 
    { 
      output << theDeck.myDeck[i]; 
    } 
    return output; 
} 

Aussi, assurez-vous que le type operator<< pour Card est correctement écrit.

+5

... qui est un point pour le répété: ** Activer les avertissements **. Avec 'g ++ -Wall -Wextra' pour le premier code, vous obtiendrez' warning: aucune instruction return dans la fonction retournant non-void' et 'warning: paramètre non utilisé 'output''. (Aussi 'Deck & theDeck' devrait probablement être' const Deck & theDeck'. _Const-correctness_ pour la victoire.) –

+0

Merci! Je ne peux pas croire que j'ai oublié ça ... – rafafan2010

Questions connexes