C ++类构造函数2d数组内存分配

时间:2015-01-14 00:12:27

标签: c++ class constructor multidimensional-array

出于好奇,我本学期在大学上了一个编程班。我们正在做C ++而且我很喜欢它,但过去两周对我来说相当陡峭,而且这让我心烦意乱:

我给出了一个类接口,如下所示:

class GameOfLife(int rows, int cols);
    public:
        GameOfLife();
        void clear();
        void set(int row, int col, int value);
        void set(int row, int col, const char* values);
        int get(int row, int col);
        void print();
        void advance();
   };

我要做的第一件事就是实现构造函数,以便为参数中传递的行和列数量的板分配内存。我以为我理解了施工人员,但有了这个,我很遗憾。 在我在私有部分中声明了行和列后,我想到了

的内容
GameOfLife::GameOfLife(int x, int y){
    rows = x;
    cols = y;
    board = new int* [rows];

但我不知道如何在没有编译器对我大喊大叫的情况下如何处理电路板的第二维,也不知道如何测试是否实际分配了新内存。 有帮助吗? :(

提前致谢!

5 个答案:

答案 0 :(得分:2)

您必须为每一行分配列数组:

  for(int i=0; i<rows; i++)
      board[i] = new int [cols];

如果分配失败(例如,当您内存不足时),您将获得exception

答案 1 :(得分:2)

除了thumbmunkey的correct answer之外,请注意,仅仅因为外部接口规定了2D数组并不意味着内部接口必须匹配。

你可以:

int* board = new int[rows * cols];

而不是get()返回:

return board[x][y];

它将改为:

return board[x * rows + y];

有时一个阵列比两个阵列更容易思考。有时它不是。取决于你想要怎么做(或者如果规定你必须使用一种方法或另一种方法)。

答案 2 :(得分:0)

您现在正在使用board = new int* [rows];做什么 正在分配一个整数指针数组。你仍然需要为thumbmunkey正在做的实际整数分配内存,

for(int i=0;i<rows;i++)
  board[i] = new int [cols];

答案 3 :(得分:0)

已经有一个动态管理内存的类,它被称为vector。如果您尝试在代码中使用new,那么您最终必须重新发明轮子并编写已经存在于向量内的数十行样板文件。

将电路板存储在一个连续的阵列中也更简单,不需要使用一堆独立的存储块来固定电路板。

以下是一个例子:

class GameOfLife
{
public:
    GameOfLife(int rows, int cols);
    void clear();
    void set(int row, int col, int value);
    void set(int row, int col, const char* values);
    int get(int row, int col);
    void print();
    void advance();
private:
    int rows, cols;
    std::vector<int> values;
};

//在cpp文件中

GameOfLife::GameOfLife(int rows, int cols)
    : rows(rows), cols(cols), values(rows * cols) {}

void GameOfLife::set(int row, int col, int value)
    { values.at(row * cols + col) = value; }

int GameOfLife::get(int row, int col) 
    { return values.at(row * cols + col); }

答案 4 :(得分:-1)

要点 - 构造函数,析构函数,getter:

    class GameOfLife
    {
    public:
        GameOfLife(int _rows, int _cols);
        ~GameOfLife ();

        int GetRows () {return rows;}
        int GetCols () {return cols;}
        int **GetBoard () {return board;}

    private:
        int rows, cols;
        int **board;
    };

    GameOfLife::GameOfLife(int _rows, int _cols)
    {
        rows = _rows;
        cols = _cols;
        board = new int *[rows];
        for (int i = 0; i<rows; i++)
            board[i] = new int[cols];
    }

    GameOfLife::~GameOfLife()
    {
        for (int i = 0; i<rows; i++)
            delete [] board[i];
        delete [] board;
    }