嗨,如果有人可以建议如何正确地做到这一点。基本上我正在尝试创建一个名为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;
}
非常基本的东西,我在这里真的很想念,但我似乎无法弄明白。 谢谢!
答案 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];
}