在我的問題被關閉幾天后,我的編輯將回答評論中的所有問題,但沒有得到批準,我決定重新發布,并做了一些修改。
我是C 的新手,但我是一個經驗豐富的程式員。我試圖創建一個國際象棋引擎,因為我已經用python做了,但我希望它更快。我將我的國際象棋棋盤存盤為一個2D的棋子指標陣列。
chessBoard.h
#include <iostream>
#include " pieces.h"
class Chess
{
private:
棋子*板[8][8] = {}。
public:
國際象棋()。
void print_board()。
};
pieces.h
enum PieceType {
卒、馬、象、車、后、王
};
enum Colour {
白,黑
};
class Piece {
protected:
PieceType pieceType。
顏色 color。
public:
char symbol;
Piece(Colour color)。
};
class Pawn : public Piece{
public:
Pawn(Colour color)。
};
//其余的棋子以同樣的方式定義。
pieces.cpp
#include " pieces.h"
Piece::Piece(Colour colour color) {
this->color = color。
}
Pawn::Pawn(Colour colour) : Piece(color) {
this->pieceType = pawn;
this->symbol = (color == white) ? 'P'/span> : 'p'/span>;
}
//其余的碎片構造器都是一樣的。
chessBoard.cpp
Chess::Chess( )
{
//后排的黑棋。
車bq_r(黑)。
Knight bq_n(black);
主教bq_b(black);
Queen bq_q(black);
國王 bk_k(black);
主教bk_b(black);
Knight bk_n(black);
Rook bk_r(black)。
board[0][0] = &bq_r;
board[0][1] = &bq_n;
board[0][2] = &bq_b;
board[0][3] = &bq_q;
board[0][4] = &bk_k;
board[0][5] = &bk_b;
board[0][6] = &bk_n;
board[0][7] = &bk_r;
}
void Chess::print_board() {
for (int i = 0; i < 8; i ) {
for (int j = 0; j < 8; j ) {
if (board[i][j]) {
std::cout << board[i][j]->符號。
std::cout << " "/span>;
} else {
std::cout << " 。"。
}
}
std::cout << std::endl;
}
}
main.cpp
#include "chessBoard.h"/span>
int main()
{
國際象棋。
chess.print_board()。
return 1;
我知道這有很多代碼,我希望我可以只發布相關的資訊,但不幸的是,我不知道問題出在哪里,而且我上一篇文章的大多數評論都要求提供更多資訊。如果需要完整的代碼,可以在這里找到。
這是第一次迭代后的截圖,在printBoard()函式的第4行遇到了std::cout。
我已經被這個問題困擾了2天,進行了研究和除錯,但我什么都沒有發現。我肯定是我做錯了一些簡單的事情,但我就是找不到它。如果你需要更多資訊,請發表評論。
謝謝你
uj5u.com熱心網友回復:
已接受的答案通過使用動態分配來創建堆物件來解決物件壽命問題,但需要注意的是,基類指標上的多型性不需要動態分配(我假設你打算以后添加虛擬函式)。
各種派生棋子可以簡單地成為Chess物件的資料成員,這通常比動態分配提供更好的性能和更少的陷阱(使用unique_ptr在棋盤上正確移動指標也可能是不必要的麻煩):
class Chess {
private:
棋子* board[8][8] = {};
車 m_white_rook;
騎士 m_white_knight;
//...所有棋子都在這里...。
public。
Chess() 。
m_white_rook(Colour::white)。
m_white_knight(顏色::白色)。
//...在這里初始化碎片...。
{
board[0][0] = &m_white_rook;
board[0][1] = &m_white_knight;
//...為棋盤分配簡單的、不屬于自己的指標...。
}
};
uj5u.com熱心網友回復:
在你的Chess::Chess()建構式中定義的物件bq_r等的壽命在建構式結束時結束,所以陣列中充滿了不能有效使用的懸空指標。
我建議改為:
#include < memory>
class Chess
{
private:
std::unique_ptr<Piece> board[8][8] = {};
public:
國際象棋()。
void print_board()。
};
Chess::Chess()
{
board[0][0] = std::make_unique<Rook> (black)。
board[0][1] = std::make_unique< Knight>(black);
board[0][2] = std::make_unique<Bishop>(black)。
board[0][3] = std::make_unique<Queen>(black)。
board[0][4] = std::make_unique<King>(black)。
board[0][5] = std::make_unique<Bishop>(black)。
board[0][6] = std::make_unique<Knight>(black)。
board[0][7] = std::make_unique<Rook>(black)。
for (auto& pawn_pos : board[1] )
pawn_pos = std::make_unique<Pawn>(black)。
/ ...。
由于unique_ptrs將通過洗掉基類Piece的指標來清理,該指標實際上指向其他類的型別,所以該類需要一個虛擬析構器:
class Piece {
public:
//...: public.
virtual ~Piece() = default;
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/313130.html
標籤:

