我正在尝试制作国际象棋游戏,而我刚开始学习c ++。我有一个基础课,我从中汲取了我的骰子。在我想要访问我在gamepos数组中的一个部分之后,程序崩溃。在knight.cpp中的mousepressevent函数中发生了崩溃。请关于我的英语。
我的代码是:
basedice.h
class basedice:public QGraphicsPixmapItem
{
public:
basedice();
enum KIND {Kinght,Rook,Pawn,Bishop,Queen,King};
KIND kind;
enum COLOR {white,black};
COLOR color;
void setposition();
basedice *gamepos[8][8];
};
basedice.cpp
basedice::basedice()
{
}
void basedice::setposition()
{
for (int i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
gamepos[i][j]=NULL;
}
}
}
board.h
class board:public basedice
{
public:
board();
void additem(QGraphicsScene *basescene);
board *_board;
};
board.cpp
board::board()
{
setZValue(0);
}
void board::additem(QGraphicsScene *basescene)
{
setposition();
_board= new board;
QPixmap boarditem (":/images/board.png");
_board->setPixmap(boarditem);
_board->setPos(0,0);
basescene->addItem(_board);
}
knight.h
class knight:public basedice
{
public:
knight();
void additem(QGraphicsScene *basescene);
QVector <knight *>_blackknight;
QVector <knight *> _whiteknight;
void mousePressEvent(QGraphicsSceneMouseEvent *event);
}
knight.cpp
knight::knight()
{
setFlag(ItemIsMovable);
setZValue(1);
}
void knight::additem(QGraphicsScene *basescene)
{
_blackknight.resize(2);
_whiteknight.resize(2);
for (int i=0;i<2;i++)
{
_blackknight[i]=new knight;
_whiteknight[i]=new knight;
}
QPixmap bknight(":/images/basb.png");
for (int i=0;i<2;i++)
{
_blackknight[i]->setPixmap( bknight);
_blackknight[i]->setPos(140+i*5*140,0);
_blackknight[i]->color=black;
_blackknight[i]->kind=Kinght;
gamepos[1+i*5][0]=(_blackknight[i]);
basescene->addItem(_blackknight[i]);
}
QPixmap wknight(":/images/wasb.png");
for (int i=0;i<2;i++)
{
_whiteknight[i]->setPixmap(wknight);
_whiteknight[i]->setPos(140+i*5*140,980);
_whiteknight[i]->color=white;
_whiteknight[i]->kind=Kinght;
gamepos[1+i*5][7]=(_whiteknight[i]);
basescene->addItem(_whiteknight[i]);
}
}
void knight::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
for (int i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
qDebug()<<gamepos[i][j];//this cause the program to crash
}
}
}
国际象棋只是为了表明我如何称呼它们: chessscene.h
class chessscene
{
public:
chessscene();
QGraphicsScene *basescene;
};
chessscene.cpp
chessscene::chessscene()
{
basescene=new QGraphicsScene;
board _board;
knight _knight;
_board.additem(basescene);
_knight.additem(basescene);
}
答案 0 :(得分:1)
我认为您可能对谁拥有程序中的哪些变量感到有些困惑。您的问题是,您在基础课程中没有按照您对basedice *gamepos[8][8];
所做的那样做。
您正在为从bacedice
继承的每个类创建一个指向basedice
s 的8x8指针矩阵。 _board
有自己的矩阵。每个骑士都有自己的矩阵:_blackknight
和_whiteknight
向量中的每个项目都有自己独立的矩阵。
您使用setposition()
初始化此矩阵,但只能在board
课程中调用该矩阵。稍后,当您尝试为gamepos
个knight
个实例调试gamepos
时,其gamepos
矩阵尚未初始化。这些矩阵不是简单共享的,因为继承者都是从同一个类继承的,而是对每个实例都是独立的。
换句话说,不要在basedice
中添加board
矩阵。相反,作为一种替代方案,我会单独将它放在您的board
课程中,如果他们需要访问{{1}的数据,则将knight
实例作为指向board
的指针传递给board
拥有。您最好在gamepos
上创建方法,将board
变量封装在gamepos
实例中,这样,例如,骑士可以向董事会询问它所在的位置,根本不需要知道board
的存在。
最后,在我看来,你根本不应该从basedice
继承QGraphicsPixmapItem
,但可能直接从board
继承{{1}}。继承意味着父类中的所有内容在继承类中都是真的。实际上,你说每块板都有一个KIND,一个COLOR和一个位置矩阵,每一块都有一个KIND,一个COLOR和一个位置矩阵。对于{{1}},KIND和COLOR没有任何意义,并且位置矩阵对你的作品没有任何意义。