如何使用我自己的类创建一个二维数组指针作为类型?

时间:2014-05-27 11:11:04

标签: c++ pointers multidimensional-array

我正在尝试使用我自己的类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();
};

1 个答案:

答案 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];
}