2014-09-03 78 views
0

我想做一个国际象棋游戏,我刚开始学习C++,我有一个basedice类,我从它派生了我的骰子。该程序崩溃后,我想访问我的作品在gamepos数组中的一件。在knight.cpp中的mousepressevent函数崩溃发生。也请关于我的英语。C++程序在给二维数组指针赋值后崩溃

我的代码是:

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只是为了显示我怎么称呼他们: 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

究竟是哪条线坠毁? – MrEricSir 2014-09-03 23:01:27

+0

在knight.cpp ..中mousepressevent函数'qDebug()<< gamepos [i] [j]' – behrooz 2014-09-03 23:46:42

+0

我的调试器表示它是从指针的内部它。 – behrooz 2014-09-03 23:48:10

回答

1

我想你可能会有点困惑,谁拥有你的程序有什么变数。你的问题是,你没有按照你认为你在使用基类的basedice *gamepos[8][8];做什么。

你在做什么是创造指针的8×8矩阵bacedice小号为每一个从basedice继承类。 _board有它自己的矩阵。每个骑士都有自己的矩阵:_blackknight_whiteknight向量中的每个项目都有其自己的单独矩阵。

您将此矩阵初始化为setposition(),但您只能在board类上调用该矩阵。之后,当您尝试为knight实例之一调试gamepos时,其gamepos矩阵尚未初始化。这些矩阵并不是简单地共享的,因为继承者都是从同一个类继承而来,相反,它们对于每个实例都是独立的。

换句话说,不要把gamepos矩阵放在basedice。相反,作为一种替代方案,如果他们需要访问board拥有的数据,则可以将其单独放入board类别中,并将您的board实例作为指向您的knight的指针。您最好在board上创建方法,将变量封装在您的board实例中,以便例如骑士可以询问董事会所在的位置,并且根本不必知道gamepos的存在。

最后,在我看来,你不应该从basediceQGraphicsPixmapItem继承board可言,但或许直接。继承意味着父类中的所有事情在继承类中都是真实的。实际上,你的意思是,每块板都有一个种类,一个颜色和一个位置矩阵,每一块都有一个种类,一个颜色和一个位置矩阵。 KIND和COLOR对board没有任何意义,而位置矩阵在你的作品中没有多大意义。