ошибка сегментации — полиморфизм в C ++ std :: list & lt; T & gt; :: iterator

Игнорируя много деталей:
Предположим, у меня есть аннотация Card класс, содержащий функцию:
virtual int getType()=0;

полученный также абстрактно GreenCard в котором есть
virtual int getType()=0;
также.

затем GreenCard получается неабстрактным Follower а также Item где определяется чистый виртуал:

int getType(){ return 1;}

в классе последователей и

int getType(){ return 2;}

в классе Item.

Позже я создаю (и заполняю) список указателей GreenCard

list<GreenCard*>* hand;

…Я хочу напечатать карты рук (в зависимости от их типов) в цикле:

    list<GreenCard *>::iterator it;

for(it=hand->begin() ; it!=hand->end() ; ++i){
tp.getCorrectType(*it);
...
}

и в этой функции я получаю SegFault в первой строке!

void getCorrectType(GreenCard* card)
{
/*SF here->*/  if(card->getType()==2){
...
}
}

я уверен, что «карта» правильно создана и инициализирована, потому что прямо в предыдущей строке я пишу в gdb: p * card
… и я могу видеть, что все его поля (связанные с картой, GreenCard и предметом — да, это «предмет») являются правильными!

Редактировать: хорошо, тогда вот еще код:

class Player{

list<GreenCard*>*   fateDeck;
list<GreenCard*>*   hand;
static const int START_HAND = 4;

Player(){
fateDeck = new list<GreenCard*> ();
hand = new list<GreenCard*>();
}

void initialize(){
DeckBuilder db;

*fateDeck = *(db.createFateDeck() );

db.deckShuffler(fateDeck);
initializeHand();
}

void initializeHand(){
for(int counter=0 ; counter<START_HAND ; counter++){
drawFateCard();
}

void drawFateCard(){
hand->push_front(fateDeck->front());
fateDeck->pop_front();
cout<<'\n'<<"Drawing from fate deck..."<<'\n'<<endl;
}

void Player::printHand(){

TypeConverter tp;
list<GreenCard *>::iterator it;

cout<<"You have " << hand->size()<<" fate cards in hand"<<'\n'
<<"They are the following:"<<endl;

for(it=hand->begin() ; it!=hand->end() ; ++it){
tp.getCorrectType(*it);
// printing depending on type
}
}

void startingPhase(){
printHand();
}
}

class DeckBuilder
{
private:
list<GreenCard*>* green;

public:
DeckBuilder();
list<GreenCard *>* createFateDeck();

void deckShuffler(list<GreenCard*>* green);
};

DeckBuilder :: DeckBuilder()
{
green = new list<GreenCard*>();
srand ( unsigned ( time (NULL) ) );
}

list<GreenCard *>* DeckBuilder :: createFateDeck()
{
int i;
for(i=0;i<40;i++)  green->push_back(new Follower());
return green;
}

void DeckBuilder :: deckShuffler(list<GreenCard*>* green)
{
vector<GreenCard *> vect;
list<GreenCard*> ::iterator it;
for(it = green->begin();it!=green->end();it++)
vect.push_back((*it));

random_shuffle ( vect.begin(), vect.end() );

green->clear();

vector<GreenCard*>:: iterator it2;
for(it2 = vect.begin();it2!=vect.end();it2++)
green->push_back((*it2));
}

и в итоге в main ()

Player pl();
pl.initialize();
pl.startingPhase;

и ошибки в printHand ();

0

Решение

Я собрал информацию, которую вы мне дали. Это компилируется и запускается без ошибок сегментации (с использованием Visual Studio 2013):

#include "stdafx.h"
#include <algorithm>
#include <iostream>
#include <vector>
#include <list>
#include <ctime>

using namespace std;

class Card
{
public:
virtual int getType() = 0;
};

class GreenCard : public Card
{
public:
virtual int getType() = 0;
};

class Follower : public GreenCard
{
public:
int getType(){ return 1; }
};

class Item : public GreenCard
{
public:
int getType(){ return 2; }
};

class TypeConverter
{
public:
void getCorrectType(GreenCard* card)
{
if (card->getType() == 1)
std::cout << "Follower" << std::endl;
if (card->getType() == 2){
std::cout << "Item" << std::endl;
}
}
};

class DeckBuilder
{
private:
list<GreenCard*>* green;

public:
DeckBuilder();
list<GreenCard *>* createFateDeck();

void deckShuffler(list<GreenCard*>* green);
};

DeckBuilder::DeckBuilder()
{
green = new list<GreenCard*>();
srand(unsigned(time(NULL)));
}

list<GreenCard *>* DeckBuilder::createFateDeck()
{
int i;
for (i = 0; i < 40; i++)  green->push_back(new Follower());
return green;
}

void DeckBuilder::deckShuffler(list<GreenCard*>* green)
{
vector<GreenCard *> vect;
list<GreenCard*> ::iterator it;
for (it = green->begin(); it != green->end(); it++)
vect.push_back((*it));

random_shuffle(vect.begin(), vect.end());

green->clear();

vector<GreenCard*>::iterator it2;
for (it2 = vect.begin(); it2 != vect.end(); it2++)
green->push_back((*it2));
}

class Player{
public:
list<GreenCard*>*   fateDeck;
list<GreenCard*>*   hand;
static const int START_HAND = 4;

Player(){
fateDeck = new list<GreenCard*>();
hand = new list<GreenCard*>();
}

void initialize(){
DeckBuilder db;

*fateDeck = *(db.createFateDeck());

db.deckShuffler(fateDeck);
initializeHand();
}

void initializeHand(){
for (int counter = 0; counter < START_HAND; counter++){
drawFateCard();
}
}

void drawFateCard(){
hand->push_front(fateDeck->front());
fateDeck->pop_front();
cout << '\n' << "Drawing from fate deck..." << '\n' << endl;
}

void Player::printHand(){

TypeConverter tp;
list<GreenCard *>::iterator it;

cout << "You have " << hand->size() << " fate cards in hand" << '\n'
<< "They are the following:" << endl;

for (it = hand->begin(); it != hand->end(); ++it){
tp.getCorrectType(*it);
// printing depending on type
}
}

void startingPhase(){
printHand();
}};

int _tmain(int argc, _TCHAR* argv[])
{
Player pl;
pl.initialize();
pl.startingPhase();
return 0;
}

Пожалуйста, предоставьте небольшой автономный пример, который демонстрирует ошибку.

0

Другие решения


По вопросам рекламы [email protected]