我正在使用gcc编译程序,当我运行a.out
时,我收到此错误:
分段错误:11
我认为这与Board::display
有关,但我认为它没有任何问题..
#include <iostream>
using namespace std;
const bool WHITE = 0;
const bool BLACK = 1;
//-----------------------------
class Piece
{
public:
// constructors
Piece();
Piece(bool color);
// functions
char getColor() const {return color; }
bool getSymbol() const {return symbol;}
protected:
bool color;
char symbol;
};
ostream& operator << (ostream& out, const Piece & piece)
{
out << piece.getSymbol();
return out;
}
Piece::Piece() { }
Piece::Piece(bool color)
{
this->color = color;
}
//-----------------------------
class King : public Piece
{
public:
King(bool color);
};
King::King(bool color) : Piece(color)
{
this->symbol = 'K';
}
//-----------------------------
class Tile
{
public:
// constructors/destructors
Tile();
Tile(Piece piece, int row, int col);
// functions
bool getColor() const {return color;}
void display();
private:
Piece piece;
int row, col;
bool color;
};
Tile::Tile() { }
Tile::Tile(Piece piece, int row, int col)
{
this->row = row;
this->col = col;
}
void Tile::display()
{
if (getColor() == BLACK)
{
if (piece.getColor() == BLACK)
cout << "\E[30;47m " << piece << " \E[0m";
else
cout << "\E[37;47m " << piece << " \E[0m";
}
else
{
if (piece.getColor() == BLACK)
cout << "\E[30;41m " << piece << " \E[0m";
else
cout << "\E[37;41m " << piece << " \E[0m";
}
}
//---------------------------
class Board
{
public:
// constructor
Board();
// functions
void display();
private:
Tile *tiles[8][8];
};
Board::Board()
{
for (int r = 0; r < 8; r++)
for(int c = 8; c < 8; c++)
tiles[r][c] = new Tile(King(BLACK), r, c);
}
void Board::display()
{
for (int r = 7; r >= 0; r--)
{
for(int c = 7; c >= 0; c--)
tiles[r][c]->display();
cout << endl;
}
}
//---------------------------
int main()
{
Board board;
board.display();
}
答案 0 :(得分:6)
在Board::display()
中,r++
应该是r--
,而c++
也是如此。
如果(像我一样)你更喜欢数组索引的无符号变量,你可以像这样编写循环:
for (std::size_t i = 0; i != N; ++i)
{
array[N - 1 - i] = something();
}
或者,如果您发现这很麻烦,但您仍然不喜欢<=
并且更喜欢迭代器式“非等于”终止(像我一样),您可以坚持使用无符号类型并说:< / p>
for (std::size_t i = N; i != 0; --i)
{
array[i - 1] = anotherthing();
}
您的下一个错误是通过基数的值存储多态对象。那不行!相反,您可能希望保存指针(或引用)。在我们学习的时候,是时候学习构造函数初始化列表了:
class Tile
{
Piece * piece; // must be a polymorphic handle!
int row;
int col;
public:
Tile(Piece * p, int r, int c) : piece(p), row(r), col(c) { }
Tile() : piece(NULL), row(0), col(0) { }
};
如果按值存储多态对象,则最终切片。你可以通过使Piece
抽象来节省自己的麻烦。
正如您所看到的,您还应该确保默认构造函数执行一些有用的操作。事实上,我认为默认构造函数实际上没有意义,你应该删除它。
最后,我应该补充一点,Tile
类设计是一个可怕的问题,因为你没有管理目前只是泄漏的Piece
对象的生命周期。如果你要管理它们,你需要在delete
的析构函数中Tile
,但是你需要实现三条规则,现在你意识到{{1}需要一个虚拟析构函数......
我意识到这将成为“如何做C ++”的完整章节,所以我现在就停止了。我想我们推荐的名单上有几本好书;请咨询那些。
答案 1 :(得分:3)
在Board::display
中,您在循环中递增变量而不是递减它们。
您也无法在piece
的构造函数中为Tile::piece
分配Tile
。 (this->piece = piece
)
答案 2 :(得分:0)
当然你的意思是:
for (int r = 7; r >= 0; r--)
{
for(int c = 7; c >= 0; c--)
是
for (int r = 6; r > 0; r--)
{
for(int c = 6; c > 0; c--)
答案 3 :(得分:0)
除非这只是一个错字:
for(int c = 8; c < 8; c++)
Board
构造函数中的是错误的,并且当您尝试使用它们时,将导致tiles
中没有一个被分配出“坏”事件的最终结果。
将其更改为:
for(int c = 0; c < 8; c++)
在某些时候你会想删除这些,但在这种情况下,更好的选择可能根本就不是指针,只是Tile tiles[8][8];
或vector<vector<Tile> > tiles
。