我正在尝试使用我自己的类Tile创建一个2d数组指针作为类型。我查看了How do I declare a 2d array in C++ using new?处的代码示例。以下代码完美无缺:
int** ary = new int*[sizeX];
for(int i = 0; i < sizeX; ++i)
ary[i] = new int[sizeY];
for(int i = 0; i < 8; i++)
for(int j = 0; j < 8; j++)
ary[i][j] = 5;
for(int i = 0; i < 8; i++)
for(int j = 0; j < 8; j++)
cout << ary[i][j];
然而,当我尝试将类型从int更改为我自己的类时,Tile,我得到了一个
XCode中的没有可行的重载'='
错误,我无法弄清楚这意味着什么。我使用以下代码:
Tile** t;
t = new Tile*[8];
for(int i = 0; i < 8; ++i)
t[i] = new Tile[8];
for(int i = 0; i < 8; i++) {
for(int j = 0; j < 8; j++) {
t[i][j] = new Tile(new NoPiece());
}
}
for(int i = 0; i < 8; i++) {
for(int j = 0; j < 8; j++) {
cout << (t[i][j].get_piece()).to_string();
}
}
以下是Tile.cpp的代码:
#include "Tile.h"
Tile::Tile() {
}
Tile::Tile(Piece p) {
piece = &p;
}
Piece Tile::get_piece() {
return *piece;
}
Tile.h的代码:
#include <iostream>
#include "Piece.h"
class Tile {
Piece * piece;
public:
Tile();
Tile(Piece p);
Piece get_piece();
};
答案 0 :(得分:1)
两个代码段之间的区别在于使用int
的代码片段将数组元素视为值,即分配
ary[i][j] = 5;
而使用Tile
的那个处理像指针这样的数组元素:
t[i][j] = new Tile(new NoPiece()); // new makes a pointer to Tile
将分配更改为没有new
的分配以解决问题:
t[i][j] = Tile(new NoPiece());
制作指针的2D数组也没有错 - 你需要的只是将它声明为“三指针”,并添加额外的间接级别:
Tile*** t;
t = new Tile**[8];
for(int i = 0; i < 8; ++i)
t[i] = new Tile*[8];
for(int i = 0; i < 8; i++) {
for(int j = 0; j < 8; j++) {
t[i][j] = new Tile(new NoPiece());
}
}
for(int i = 0; i < 8; i++) {
for(int j = 0; j < 8; j++) {
cout << (t[i][j]->get_piece()).to_string();
}
}
// Don't forget to free the tiles and the array
for(int i = 0; i < 8; i++) {
for(int j = 0; j < 8; j++) {
delete t[i][j];
}
delete[] t[i];
}