因此,如果我有一个带有2D数组的类,我想用传递给构造函数的两个参数进行初始化,我该怎么做,我一直遇到错误,因为它不会让我更新二维数组完全在构造函数中。
- 从评论中更新:
在我的头文件中,我尝试了两个
int array[][]
和
int **array
然后在我正在尝试做的构造函数中的.cpp文件中
array = new int[arg1][arg2]
头文件中的数组声明都没有工作。
答案 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;
}