因此,如果我有一个带有二维数组的类,我想用传递给构造函数的两个参数来初始化,我该怎么做,我会一直遇到错误,因为它根本不会让我更新二维数组构造函数。
--评论更新:
在我的头文件中,我都尝试了
int array[][]
和
int **array
然后在我试图做的构造函数的.cpp文件中
array = new int[arg1][arg2]
头文件中的数组声明都不起作用。
因此,如果我有一个带有二维数组的类,我想用传递给构造函数的两个参数来初始化,我该怎么做,我会一直遇到错误,因为它根本不会让我更新二维数组构造函数。
--评论更新:
在我的头文件中,我都尝试了
int array[][]
和
int **array
然后在我试图做的构造函数的.cpp文件中
array = new int[arg1][arg2]
头文件中的数组声明都不起作用。
在构造函数中我试图做 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;
}
最简单的解决方案是:
std::vector<std::vector<VALUE>> arr2(X, std::vector<VALUE>(Y));
这是一个基于 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;
}