如何使用给定构造函数的大小在 C++ 中初始化数组?
How can I initialize an array in C++ with a size that is given to the constructor?
我有一个 C++ class,其成员应该是一个二维数组。我想在 class 的头文件中将我的数组声明为成员。然后在我的 class 的构造函数中,我想用一个大小(给构造函数)初始化我的数组并用零填充它。
我在 java 中有一个我想要的工作示例:
class Obj {
int[][] array;
public Obj(int sizex, int sizey) {
array = new int[sizex][sizey];
}
}
public class Main
{
public static void main(String[] args) {
Obj o = new Obj(12,20);
}
}
我不想弄乱指针或 alloc() 和 free()。因为我的 class 基本上应该是这个数组的包装器,所以我想保持简单。
我考虑过使用 std::vector,但由于数组在初始化后从未调整过大小,我觉得 vector 有点过分了...有没有比这更好的方法:?
#include<vector>
class Obj {
std::vector<std::vector<int>> array;
public:
Obj(int xsize, int ysize) {
std::vector<std::vector<int>> newArray(xsize, std::vector<int>(ysize, 0));
array = newArray;
}
};
int main()
{
Obj o(12,20);
}
std::vector
是这里的最佳匹配。 (正如您所说,在大多数情况下,可以避免使用原始数组和指针。另请参阅 How can I efficiently select a Standard Library container in C++11?)
而且你可以直接在member initializer list中初始化数据成员,而不是在默认初始化后在构造函数体中赋值,例如
Obj(int xsize, int ysize) : array(xsize, std::vector<int>(ysize, 0)) {
}
除了使用 std::vector 之外,您还可以从堆中分配所需大小的内存。
class Obj {
int** arr;
int x, y;
public:
Obj(int sizex, int sizey) : x(sizex), y(sizey) {
arr = new int*[sizex];
for (unsigned i = 0; i < sizex; i++) {
arr[i] = new int[sizey];
}
}
//IMPORTANT TO DELETE, OTHERWISE YOU'LL GET A MEMORY LEAK
~Obj() {
for (unsigned i = 0; i < x; i++) {
delete[] arr[i];
}
delete[] arr;
}
}
我有一个 C++ class,其成员应该是一个二维数组。我想在 class 的头文件中将我的数组声明为成员。然后在我的 class 的构造函数中,我想用一个大小(给构造函数)初始化我的数组并用零填充它。
我在 java 中有一个我想要的工作示例:
class Obj {
int[][] array;
public Obj(int sizex, int sizey) {
array = new int[sizex][sizey];
}
}
public class Main
{
public static void main(String[] args) {
Obj o = new Obj(12,20);
}
}
我不想弄乱指针或 alloc() 和 free()。因为我的 class 基本上应该是这个数组的包装器,所以我想保持简单。
我考虑过使用 std::vector,但由于数组在初始化后从未调整过大小,我觉得 vector 有点过分了...有没有比这更好的方法:?
#include<vector>
class Obj {
std::vector<std::vector<int>> array;
public:
Obj(int xsize, int ysize) {
std::vector<std::vector<int>> newArray(xsize, std::vector<int>(ysize, 0));
array = newArray;
}
};
int main()
{
Obj o(12,20);
}
std::vector
是这里的最佳匹配。 (正如您所说,在大多数情况下,可以避免使用原始数组和指针。另请参阅 How can I efficiently select a Standard Library container in C++11?)
而且你可以直接在member initializer list中初始化数据成员,而不是在默认初始化后在构造函数体中赋值,例如
Obj(int xsize, int ysize) : array(xsize, std::vector<int>(ysize, 0)) {
}
除了使用 std::vector 之外,您还可以从堆中分配所需大小的内存。
class Obj {
int** arr;
int x, y;
public:
Obj(int sizex, int sizey) : x(sizex), y(sizey) {
arr = new int*[sizex];
for (unsigned i = 0; i < sizex; i++) {
arr[i] = new int[sizey];
}
}
//IMPORTANT TO DELETE, OTHERWISE YOU'LL GET A MEMORY LEAK
~Obj() {
for (unsigned i = 0; i < x; i++) {
delete[] arr[i];
}
delete[] arr;
}
}