将值分配给2D指针数组后,C ++程序崩溃

时间:2014-09-03 22:37:55

标签: c++ arrays qt class qgraphicsitem

我正在尝试制作国际象棋游戏,而我刚开始学习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);

}

1 个答案:

答案 0 :(得分:1)

我认为您可能对谁拥有程序中的哪些变量感到有些困惑。您的问题是,您在基础课程中没有按照您对basedice *gamepos[8][8];所做的那样做。

您正在为从bacedice 继承的每个类创建一个指向basedice s 的8x8指针矩阵。 _board有自己的矩阵。每个骑士都有自己的矩阵:_blackknight_whiteknight向量中的每个项目都有自己独立的矩阵。

您使用setposition()初始化此矩阵,但只能在board课程中调用该矩阵。稍后,当您尝试为gameposknight个实例调试gamepos时,其gamepos矩阵尚未初始化。这些矩阵不是简单共享的,因为继承者都是从同一个类继承的,而是对每个实例都是独立的。

换句话说,不要在basedice中添加board矩阵。相反,作为一种替代方案,我会单独将它放在您的board课程中,如果他们需要访问{{1}的数据,则将knight实例作为指向board的指针传递给board拥有。您最好在gamepos上创建方法,将board变量封装在gamepos实例中,这样,例如,骑士可以向董事会询问它所在的位置,根本不需要知道board的存在。

最后,在我看来,你根本不应该从basedice继承QGraphicsPixmapItem,但可能直接从board继承{{1}}。继承意味着父类中的所有内容在继承类中都是真的。实际上,你说每块板都有一个KIND,一个COLOR和一个位置矩阵,每一块都有一个KIND,一个COLOR和一个位置矩阵。对于{{1}},KIND和COLOR没有任何意义,并且位置矩阵对你的作品没有任何意义。