0

我有一个需要有一个二维数组的类,我可以在构造过程中通过传递两个参数来对其进行初始化。如何在类中声明二维动态数组。

class Life
{
public:
    Life (int rows, int cols);
    ~Life ();
    Life(const Life& orig);
    Life& operator=(const Life& rhs);

    void init();
    void print();
    void update();
    void instructions();
    bool user_says_yes();
private:
    int rows;
    int cols;

    int neighbor_count(int row, int col);
    int** grid;
};

Life::Life(int row, int col)
{
    rows = row;
    cols = col;
    grid = new [rows][cols];
}

我知道数组有问题,因为在构造函数中它说它应该是一个常量值。但在用户输入值之前,我不会知道该值。但不知何故,我需要在这个类中有一个数组,它将被动态创建为指定的大小。现在我不能使用向量,但是如果你知道如何使它与向量一起工作,它可能会帮助其他人。

4

2 回答 2

1

我这样做:

grid=new int*[rows];
for(int i=0;i<rows;i++){
      grid[i]=new int[cols];
}

第一行初始化一个数组,该数组总共包含指针,然后分配这些指针中的每一个来保存总共cols整数。在你的析构函数中:

for(int i=0;i<rows;i++){
      delete[] grid[i];
}
delete[] grid;

在这里,您必须先解除分配行,因为网格正在存储它们的地址,首先删除它会导致您丢失它们。

请记住,如果您复制此类的对象,您也需要对副本进行初始化。这包括=运算符和复制构造函数。

于 2013-09-28T02:31:50.137 回答
0

你是对的,你应该使用向量的向量。但既然不能...

有两种方法可以做一个二维向量。第一种是创建一个一维向量,并在访问时将两个维度压缩为一个。如果你想把它当作二维的,你可以把它放在一个类方法后面。 grid = new int[rows*cols]; grid[c*rows+r]

第二种方法是创建一个指针数组,其中每个指针是一行的一维数组。您需要单独分配所有行指针。

于 2013-09-28T02:33:20.967 回答