C++ STD中的多态性:列表> T >::迭代器
忽略很多细节: 假设我有一个包含函数的抽象卡片类: 虚拟int getType=0 由抽象绿卡派生,其中有 虚拟int getType=0; 还有 然后,绿卡由非抽象跟随者和定义纯虚拟的项目导出:C++ STD中的多态性:列表> T >::迭代器,c++,segmentation-fault,polymorphism,virtual,invocation,C++,Segmentation Fault,Polymorphism,Virtual,Invocation,忽略很多细节: 假设我有一个包含函数的抽象卡片类: 虚拟int getType=0 由抽象绿卡派生,其中有 虚拟int getType=0; 还有 然后,绿卡由非抽象跟随者和定义纯虚拟的项目导出: int getType(){ return 1;} 在追随者阶级和 int getType(){ return 2;} 在Item类中 稍后,我创建并填写一个绿卡指针列表 名单*手 …我想根据循环中的手牌类型打印手牌: list<GreenCard *>::iterator i
int getType(){ return 1;}
在追随者阶级和
int getType(){ return 2;}
在Item类中
稍后,我创建并填写一个绿卡指针列表
名单*手
…我想根据循环中的手牌类型打印手牌:
list<GreenCard *>::iterator it;
for(it=hand->begin() ; it!=hand->end() ; ++i){
tp.getCorrectType(*it);
...
}
我确信该卡是正确创建和初始化的,因为就在前一行中,我写入了gdb:p*卡
…我可以看到它的所有字段卡,绿卡和项目相关的是,这是一个'项目'是正确的
编辑:好,下面是一些代码:
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));
}
印刷品中的缺陷 我把你给我的信息拼凑起来了。使用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;
}
请提供一个小的、独立的示例来演示错误。您能在列表中显示代码吗?分段故障输出?同上。看起来列表中的指针坏了。您是否可以选择使用智能指针,例如共享指针而不是原始指针?另外,您没有说明tp.getCorrectType中的tp是什么…您可能已经删除了列表所指向的对象,但是您没有发布填充列表的代码,这可能是问题的根源。该对象可能已被删除,这将导致以后访问该对象时出现SIGSEV;或者可能内存已被释放,只是没有其他内容覆盖了它。我不知道您的调试器在这种情况下是如何工作的。@user2409839-那么您希望它如何帮助您呢?你声称你所做的一切都是错的,但有些事情是错的。我们只有一个循环,您可以显示有效的C++代码和函数调用。那真的没用。我和我的同事已经进行了深入的研究,但仍然无法证明这一错误的合理性,有什么想法可以解释为什么会发生这种情况吗??这是错误的结论。每次撞车都是有道理的。你只是还没有找到坠机的原因。
Player pl();
pl.initialize();
pl.startingPhase;
#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;
}