2014-07-07 2 views
1

Я просто изучаю C++. Я делаю практику со списком инициализации, поэтому я сделал класс, как этогоC++ Определить массив с константой int

class Matrix 
{ 
    public: 
     const int x_size; 
     const int y_size; 
     int *data; 

     Matrix(int _x_size, int _y_size) : x_size(_x_size), y_size(_y_size) 
     { 
      data = new int[y_size][x_size]; 
     } 

     ~Matrix() 
     { 
      delete[][] data; 
     } 
}; 

int main(void) 
{ 
    Matrix A = Matrix(10, 10); 
    return 0; 
} 

И компилятор сказал как: размер массива в операторе нового должен быть постоянным. Итак, я искал и сказал, что это не постоянная времени компилятора.

Но очевидно, что я не могу использовать этот размер в качестве макросов здесь ... Затем. Как мне получить массив правильного размера с конструктором?

+3

вы действительно должны использовать один, 1D массив, и добавить доступ с помощью двух индексов. Для упрощения вещей массив 1D может быть 'std :: vector '. – juanchopanza

+2

Забудьте о массивах, используйте std :: vector. –

+0

Удалением будет 'delete [] data;' btw - форма 'delete []' охватывает массивы любого измерения. –

ответ

4

Если вы просто изучаете C++, то лучший совет - держаться подальше от управления памятью. Используйте stl-типы, если сможете. Используйте зЬй :: вектор заменить этот массив:

std::vector<std::vector<int>> data; 

создать его так:

data(y_size, std::vector<int>(x_size, 0)); 

и доступ к нему, как это:

data[i][j]; 

Как сказал jaunchopanza, вы можете также используйте 1D-массив, который может быть лучше. Вы бы создать и отредактировать его подобным же образом:

std::vector<int> data; 
data(y_size * x_size, 0); 
data[y_size*i + j]; 

Преимущество заключается в том, что это скорее для доступа, особенно если x_size и y_size будут большими. Также существует преимущество в том, что вектор векторов может храниться повсюду, так как в каждой строке (или столбце) будет находиться в разных местах в памяти. Если вы собираетесь получать данные, которые перекрывают более одной строки (или столбца), тогда было бы лучше использовать массив 1D для скорости.

Вы можете найти больше информации здесь: http://en.cppreference.com/w/cpp/container/vector

Если вы хотите, чтобы превратить это в матрицу и сделать математику и т.д., чем я очень рекомендую Eigen это, безусловно, лучшая матрица библиотека: http://eigen.tuxfamily.org/index.php?title=Main_Page

+1

Downvoter, позаботьтесь, чтобы добавить комментарий, объясняющий, чтобы я мог лучше ответить на мои вопросы? –

+0

ОП, похоже, пытается получить один блок данных, что и нужно делать. Вектор векторов представляет собой кучу фрагментированных блоков данных. Это не похоже на лучший способ представить стандартную матрицу N * M. – juanchopanza

+0

@juanchopanza Да, я думаю, вы, возможно, только что видели, что я его отредактировал. –

-2

вы должны написать что-н, как это (хотя это не исключение безопасно)

class Matrix 
{ 
    public: 
     const int x_size; 
     const int y_size; 
     int ** data; 

     Matrix(int _x_size, int _y_size) : x_size(_x_size), y_size(_y_size) 
     { 
      data = new int* [y_size]; 
      for(int i =0 ; i < y_size ; i++) 
      { 
       data[i] = new int[x_size] ; 
      } 
     } 

     ~Matrix() 
     { 
      for(int i= 0 ; i < y_size ; i++) 
      { 
       delete [] data[i]; 
      } 
      delete[] data; 
     } 
}; 
+1

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

+0

этот код предназначен для образовательной цели, чтобы исправить его оригинальную идею, и да, это не исключение. :) –

+0

Тот факт, что это для образовательных целей, является именно тем, почему это плохой ответ: мы должны учить C++ newbbies о лечении резорбции, raii, семантика значений и т. д .; а не ручное управление памятью – Manu343726

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