1

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

--评论更新:

在我的头文件中,我都尝试了

int array[][] 

int **array 

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

array = new int[arg1][arg2]

头文件中的数组声明都不起作用。

4

3 回答 3

4

在构造函数中我试图做 array = new array [arg1][arg2]

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

array = new int[arg1][arg2];

请注意,这仅适用于 C++11 - 使用旧标准时,第二个数组大小需要为 const (这可能不是您想要的)。

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

理想情况下,由于无论如何您都在使用 C++,因此您应该std::vector按照另一个答案中的建议使用。

向量使用大量开销,不是吗?我试图保持我的记忆使用光。——</p>

开始std::vector。一旦您的应用程序从功能角度正常运行,如果您仍然担心内存使用和/或性能,请进行基准测试。如果您将二维数组正确封装在一个类中,您始终可以更改数组的实际实现,而不会影响使用它的代码。


从技术上讲,如果你想确保你有一个包含数组的平坦内存区域,你可以使用一维数组来模拟二维数组,就像下面的代码一样(只是为了让你明白,当然需要一些改进,尤其是缺少复制构造和赋值运算符):

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;
}
于 2013-06-07T07:45:34.753 回答
0

最简单的解决方案是:

std::vector<std::vector<VALUE>> arr2(X, std::vector<VALUE>(Y));
于 2013-06-07T07:47:57.027 回答
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;
}
于 2019-07-25T14:54:32.573 回答