c++ - 如何在 C++ 堆上创建二维数组?

标签 c++ arrays

我正在尝试用 C++ 进行国际象棋模拟。我创建了一个类 Pieces,我想在堆上创建一个由所有 Pieces 组成的二维数组。这是我的代码:国王、王后和其他代码源自棋子。

king = new King();
queen = new Queen();
knight = new Knight();
bishop = new Bishop();
rook = new Rook();
pawn = new Pawn();
empty = new Pieces();

Pieces* startup[64] = {rook, knight, bishop, king, queen, bishop, knight, rook,
                       pawn, pawn, pawn, pawn, pawn, pawn, pawn, pawn,
                       empty, empty, empty, empty, empty, empty, empty, empty,
                       empty, empty, empty, empty, empty, empty, empty, empty,
                       empty, empty, empty, empty, empty, empty, empty, empty,
                       empty, empty, empty, empty, empty, empty, empty, empty,
                       pawn, pawn, pawn, pawn, pawn, pawn, pawn, pawn,
                       rook, knight, bishop, king, queen, bishop, knight, rook};
Pieces* board = new Pieces[8][8];
int k = 0;
for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
        board[i][j] = startup[k];
        k++;
    }
}

但这给了我以下错误:

ChessBoard.cpp: In constructor ‘ChessBoard::ChessBoard()’:
ChessBoard.cpp:25: error: cannot convert ‘Pieces (*)[8]’ to ‘Pieces*’ in initialization
ChessBoard.cpp:29: error: no match for ‘operator[]’ in ‘board[i][j]’

如何在堆上成功分配二维数组? 创建指向 Pieces 的指针数组或创建 Pieces 对象数组哪个更好?

最佳答案

为什么需要所有动态分配?只需拥有一个 64 元素枚举数组,并在顶部分层一些伪造的 2D 索引即可。

这是一个例子:

#include <array>
#include <iostream>

enum class piece_t
{
   EMPTY = 0, PAWN, ROOK, BISHOP, KNIGHT, QUEEN, KING
};

static const size_t WIDTH = 8, HEIGHT = 8;
struct board_t : std::array<piece_t, WIDTH*HEIGHT>
{
    board_t()
    {
        for (size_t y = 0; y < HEIGHT; y++)
            for (size_t x = 0; x < WIDTH; x++)
                operator()(x,y) = piece_t::EMPTY;
    }

    piece_t& operator()(size_t x, size_t y)
    {
        return operator[](x + y*WIDTH);
    }

    const piece_t& operator()(size_t x, size_t y) const
    {
        return operator[](x + y*WIDTH);
    }
};

std::ostream& operator<<(std::ostream& os, const piece_t& piece)
{
    switch (piece) {
        case piece_t::KING:   return (os << 'K');
        case piece_t::QUEEN:  return (os << 'Q');
        case piece_t::KNIGHT: return (os << 'N');
        case piece_t::BISHOP: return (os << 'B');
        case piece_t::ROOK:   return (os << 'R');
        case piece_t::PAWN:   return (os << 'P');
        case piece_t::EMPTY:  return (os << ' ');
        default:              return (os << '?');
    }
}

std::ostream& operator<<(std::ostream& os, const board_t& board)
{
    os << '+' << std::string(WIDTH, '-') << '+' << '\n';
    for (size_t y = 0; y < HEIGHT; y++) {
        os << '|';
        for (size_t x = 0; x < WIDTH; x++)
            os << board(x, y);
        os << '|' << '\n';
    }
    os << '+' << std::string(WIDTH, '-') << '+' << '\n';
    return os;
}

int main()
{
   board_t b;
   b(3, 5) = piece_t::KING;
   b(6, 4) = piece_t::KNIGHT;
   std::cout << b << std::endl;
   // etc.
}

Live demo

简单多了,而且更安全。 :-)

关于c++ - 如何在 C++ 堆上创建二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21138427/

相关文章:

arrays - 根据变量 Swift 3 中的共同值减少对象数组

c++ - 按位读取文件 C++

java.lang.ArrayStoreException 在整数数组中存储整数

C - 指向动态结构数组的指针

arrays - 如果条件匹配, typescript 数组删除项目

c++ - 如何获得我在二维数组中声明和初始化的所有值的总和?

c++ - DLL使用sqlite3从不同进程写入同一个数据库文件

c++ - 如何修复 OpenCL 卡住?

c++ - 我如何告诉 lcov 在哪里可以找到我的 .cpp 和 .h 文件?

c++ - 使用继承时类的大小是多少?