2013-09-28 2 views
0

У меня есть класс, который должен иметь двухмерный массив, который я могу инициализировать во время построения, передав ему два параметра. Как вы объявляете двумерный динамический массив внутри класса.Как объявить двумерный динамический массив внутри класса в C++

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

Я знаю, что в массиве что-то не так, потому что в конструкторе сказано, что оно должно быть постоянным значением. Но я не буду знать значение, пока пользователь не войдет в значения. Но каким-то образом мне нужно иметь массив в этом классе, который будет динамически создан до указанного размера. На данный момент я не могу использовать векторы, но если вы знаете, как заставить его работать с векторами, это может помочь другим.

+0

use 'std :: vector' – Kal

+0

@Kal О, вау, это похоже, супер полезно, особенно после того, как OP ясно сказал, что знает о векторах, но не может использовать их сейчас! – us2012

+0

@ us2012 ur welcome – Kal

ответ

1

я сделать это так:

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

Первая строка инициализирует массив, который будет содержать в общей сложности строк указателей, а затем каждый из этих указателей выделяется провести в общей сложности перевалы целые числа. А в вашем деструкторе:

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

Здесь вы должны освободить ряды первых, потому что сетки хранит их адреса, и удаление его первый приведет к потере их.

Имейте в виду, что если вы скопируете объект этого класса, вам также потребуется выполнить эту инициализацию для копии. Это включает в себя оператор = и конструктор копирования.

+0

+1 Но OP должен делать то же самое и в операциях копирования и присваивания. Также немного объясните, что делает текущий код. Было бы полезно для любого в будущем, а не только для публикации кода. – Mahesh

+0

Это правильно. Добавление его к ответу – memo1288

+0

Я видел это раньше, но, наконец, прочитав его с вашим описанием, он имеет смысл. Я собираюсь попробовать это. Функция обновления должна объявить еще один двухмерный массив, чтобы скопировать все из сетки, поэтому мне тоже придется это сделать. – Alex

0

Вы правы, вы должны использовать вектор векторов. Но так как вы не можете ...

Существует два способа сделать двумерный вектор. Первый заключается в создании одномерного вектора и уплотнении двух измерений в один, когда вы обращаетесь к нему. Вы можете поместить это за метод класса, если хотите рассматривать его как 2-D. grid = new int[rows*cols]; grid[c*rows+r]

Второй способ - создать массив указателей, где каждый указатель представляет собой одномерный массив для строки. Вам нужно выделить все указатели строк по отдельности.

Смежные вопросы