创建类的二维数组

时间:2013-08-13 18:56:47

标签: c++ arrays class

嗨,如果有人可以建议如何正确地做到这一点。基本上我正在尝试创建一个名为Board的类变量,它在其中包含一个ChessPiece实例的二维数组。

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;

class ChessPiece
{
public:
    char ToChar() { return '#'; };
};

class ChessBoard
{
    int Size;   //This means board is 8x8.
    ChessPiece ** Board;

public:
    ChessBoard();
    int GetSize() { return Size; };

    void PlotBoard();
};

ChessBoard::ChessBoard() {
    Size = 8;
    ChessPiece newBoard[Size][Size];
    Board = newBoard; //Problem here!!! How do I make Board an 8x8 array of ChessPiece?
}

void ChessBoard::PlotBoard() {
    int x, y;
    for (x = 0; x < Size; x++) {
        for (y = 0; y < Size; y++)
            printf("%c", Board[x][y].ToChar());
    }
}

int main()
{
    // ChessBoard board;
    // printf("%d", board.GetSize());
    // board.PlotBoard();

    ChessBoard * a = new ChessBoard();

    return 0;
}

非常基本的东西,我在这里真的很想念,但我似乎无法弄明白。 谢谢!

5 个答案:

答案 0 :(得分:2)

在您的方案中没有理由使用原始指针。我建议将电路板保持为​​单维std::vector,并在迭代电路板时简单地使用行/列的乘法。

class ChessBoard
{
public:
   ChessBoard(size_t row_count) : Size(row_count), Board(row_count * row_count)
   {
   }

   void PlotBoard()
   {
     for(size_t row = 0; row < Size; ++row)
     {
        for(size_t col = 0; col < Size; ++col)
            printf("%c", Board[(row * Size) + col].ToChar());
     }
   }
}

private:
   size_t Size;
   std::vector<ChessPiece> Board;
};

答案 1 :(得分:1)

class ChessBoard {
    public:
    enum Field {
       Empty,
       Pawn,
       ...
    };
    const Columns = 8;
    const Rows = 8;
    Field& operator()(unsigned column, unsigned row) { 
        return fields(column * Rows + row);
    } // omitting const/non const and range checks

    private:
    Field fields[Columns * Rows];
};

答案 2 :(得分:0)

将构造函数更改为:

ChessBoard::ChessBoard():Size(8) {
    Board=new ChessPiece*[Size];

    for (int i=0;i<Size;++i)
        Board[i]=new ChessPiece[Size];
}

您还需要一个析构函数:

ChessBoard::~ChessBoard()
{
    for (int i=0;i<Size;++i)
        delete [] Board[i];

    delete [] Board;
}

如果您想允许复制/移动,请务必添加适当的复制/移动构造函数和复制/移动赋值运算符。

答案 3 :(得分:0)

我去年做过类似的项目。为此,我创建了一个Square类,因此Board将由一个2-D Square组成。我认为这样你就有了更大的灵活性,你可以为Square创建方法,比如检查Square上是否有Piece(它自己的类),什么类型的Piece以及添加和删除Pieces。

我认为你需要以基本的OO方式解决问题。

答案 4 :(得分:-1)

这里的问题是newBoard正在使用自动存储持续时间创建,这意味着当你超出范围时(在ChessBoard构造函数的末尾)它将被清除。如果Size永远不会改变,你可以将它设置为常量并创建如下的板:

#define SIZE 8
class ChessBoard
{
    ChessPiece Board[SIZE][SIZE];

如果Size可能会改变,你需要在这样的循环中分配数组:

Board = new ChessPiece *[Size];
for (int i = 0; i < Size; i++){
    Board[i] = new ChessPiece[Size];
}