我刚学习C ++。我正在使用初始化列表进行练习,所以我创建了一个像这样的类
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;
}
编译器说:运算符new中的数组大小必须是常量。 所以我搜索了一下,有人说,这些不是编译时间常数'。
但很明显,我不能在这里使用那个大小作为宏... 然后。我应该如何使用Constructor获得适当大小的数组?
答案 0 :(得分:4)
如果您只是学习c ++,那么最好的建议就是远离内存管理。如果可以,请使用stl类型。使用std :: vector替换该数组:
std::vector<std::vector<int>> data;
像这样创建:
data(y_size, std::vector<int>(x_size, 0));
并像这样访问:
data[i][j];
正如jaunchopanza所说,你也可以使用可能更好的一维阵列。您可以用类似的方式创建和编辑它:
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 :(得分:-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;
}
};