2D数组作为类的实例变量

时间:2013-06-07 07:36:19

标签: c++ arrays multidimensional-array

因此,如果我有一个带有2D数组的类,我想用传递给构造函数的两个参数进行初始化,我该怎么做,我一直遇到错误,因为它不会让我更新二维数组完全在构造函数中。

- 从评论中更新:

在我的头文件中,我尝试了两个

int array[][] 

int **array 

然后在我正在尝试做的构造函数中的.cpp文件中

array = new int[arg1][arg2]

头文件中的数组声明都没有工作。

3 个答案:

答案 0 :(得分:3)

  

在构造函数中我正在尝试执行array = new array [arg1] [arg2]

您需要指定数组类型,例如

array = new int[arg1][arg2];

注意this works in C++11 only - 当使用旧标准时,第二个数组大小需要是const(这可能不是你想要的)。

还有一些其他文章讨论了同一个问题:

理想情况下,既然你正在使用C ++,你应该使用另一个答案中提出的std::vector

  

矢量虽然使用了很多开销,不是吗?我正试图保持记忆力。 -

std::vector开始。一旦您的应用程序从功能角度正常运行,如果您仍然关注内存使用和/或性能,执行基准测试。如果将2D数组正确封装在类中,则可以随时更改数组的实际实现,而不会影响使用它的代码。


技术上,如果你想确保你有一个包含阵列的平坦内存区域,你可以使用一维数组来模拟一个2-维数组,就像在下面的代码中一样(只是为了得到你的想法,当然需要一些改进,尤其是副本构造和赋值运算符丢失):

class Array2D {
private:
    int *array;
    int size1;

public:
    Array2D(int arg1, int arg2) {
        size1 = arg1;
        array = new int[arg1 * arg2];
    }

    ~Array2D() {
        delete[] array;
    }

    int& at(int i1, int i2) {
        return array[i1 * size1 + i2];
    }
};

int main() {
    Array2D array(10, 10);

    array.at(2, 2) = 42;
    std::cerr << array.at(2, 2);

    return 0;
}

答案 1 :(得分:0)

最简单的解决方案是:

std::vector<std::vector<VALUE>> arr2(X, std::vector<VALUE>(Y));

答案 2 :(得分:0)

这是一个基于Andreas Fester的示例的带有边界检查和自定义类型的二维数组示例。

#include <stdexcept>

template <typename T>
class Array2D {
private:
    T *array;
    unsigned int sizeX;
    unsigned int sizeY;

public:
    Array2D(unsigned int X, unsigned int Y) {
        sizeX = X;
        sizeY = Y;
        array = new T[X * Y];
    }

    ~Array2D() {
    delete[] array;
    }

    T& at(unsigned int X, unsigned int Y) {
        if((X > sizeX) || (Y > sizeY))
            throw std::out_of_range("Bla bla");

        return array[X * sizeX + Y];
    }
};

int main() {
    double MyValue;
    Array2D<double> *MyArray = new Array2D<double>(10, 100);
    MyArray->at(1,1) = 10.1;
    MyValue = MyArray->at(1,1);
    printf("Array value = %3.3f\n", MyValue);

    return 0;
}