gpt4 book ai didi

c++ - 段错误 : 11 - Where is it?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:28:07 26 4
gpt4 key购买 nike

我正在用 gcc 编译一个程序,当我运行 a.out 时,我得到这个错误:

Segmentation fault: 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();
}

最佳答案

Board::display() , r++应该是 r-- , c++ 同上.

如果(像我一样)您更喜欢数组索引的无符号变量,您可以像这样编写循环:

for (std::size_t i = 0; i != N; ++i)
{
array[N - 1 - i] = something();
}

或者,如果您觉得这很麻烦,但您仍然真的不喜欢 <=并且更喜欢迭代器风格的“不等于”终止(像我一样),你可以坚持使用无符号类型并说:

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 的析构函数中的片段,但是你需要实现三法则,现在你意识到 Piece需要一个虚拟析构函数...

我意识到这将变成“如何使用 C++”的完整章节,所以我现在就此打住。我认为我们推荐的书单上有几本好书;请咨询那些。

关于c++ - 段错误 : 11 - Where is it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9653608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com