C++Deck类中的分段故障(堆芯转储)

Segmentation Fault (core dumped) in C++ Deck class

本文关键字:转储 故障 分段 C++Deck      更新时间:2023-10-16

我想从Cards的类中生成一个名为Deck的类。然而,每当我试图查看我在Deck中放入了什么时,我都会收到一个错误,上面写着Segmentation fault (core dumped)。我该怎么解决这个问题?我从其他问题中了解到,我的程序可能试图访问尚未分配的内存,但我不知道这是在哪里发生的。这是我写的代码:

甲板.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;
}

您的方法

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

应该返回ostream&,但它没有返回任何内容。此外,您应该在output上调用operator<<,而不是在cout上调用(您将把cout传递给此方法):

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

此外,请确保Card类型的operator<<已正确写入。