如何在C ++中的类中声明二维动态数组

时间:2013-09-28 02:27:57

标签: c++ arrays dynamic

我有一个类需要有一个二维数组,我可以在构造期间通过传递两个参数来初始化它。如何在类中声明二维动态数组。

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

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

2 个答案:

答案 0 :(得分: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;

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

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

答案 1 :(得分:0)

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

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

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