Reputation: 1579
I want to make a class called Deck
out of a class of Cards
. However, whenever I try to see what I've put in my Deck
, I get an error that says Segmentation fault (core dumped)
. How can I fix this? I've read from other questions that my program might be trying to access memory that hasn't been allocated, but I don't know where that is happening. This is the code I wrote:
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;
}
Upvotes: 0
Views: 375
Reputation: 22157
Your method
ostream &operator<<(ostream &output, Deck &theDeck)
{
for(int i = 0; i < 52; i++)
{
cout << theDeck.myDeck[i];
}
}
should return ostream&
, but it is not returning anything. Also, you should call operator<<
on output
and not on the cout
(you will pass cout
to this method):
ostream &operator<<(ostream &output, const Deck &theDeck)
{
for(int i = 0; i < 52; i++)
{
output << theDeck.myDeck[i];
}
return output;
}
Also, make sure that the operator<<
for Card
type is properly written.
Upvotes: 6