C ++使用Const int定义数组

时间:2014-07-07 06:29:35

标签: c++ arrays constructor size const

我刚学习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获得适当大小的数组?

2 个答案:

答案 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_sizey_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;
        }
};