C ++在构造函数中设置数组大小,复制2D数组

时间:2012-10-28 22:42:19

标签: c++ arrays

所以在我的类Foo的头文件中,我声明了一个像这样的2D数组:

int board[][];

我故意遗漏一个大小,因为我想在构造函数中设置它。初始化后,board[][]的大小不会改变。我的一个构造函数看起来像这样:

Foo(int _board[][]);

在此,我想将board[][]设置为与_board[][]相同的大小,并复制内容。我试过在Foo的.cpp实现中使用它:

Foo::Foo(int _board[][]){
board[][] = _board[][]; //Does not work as intended
}

但是,这不符合预期。如何使board[][]与构造函数中的_board[][]具有相同的大小并具有相同的内容?

1 个答案:

答案 0 :(得分:1)

C ++与Java不同。 int a[][];不允许作为变量类型。一些误导性的C ++特性是允许第一个大小为空:

int foo(int a[]);
int foo(int a[][3]); 
int foo(int a[][3][4]); 

另一个误导性的C ++特性是在数组初始化时允许这样做(编译器会计算大小):

int a[][] = {{1,2}, {1,2,3,4}, {1}};

相当于:

int a[3][4] = {{1,2}, {1,2,3,4}, {1}};

就你的情况而言 - 使用std :: vector:

std::vector<std::vector<int>> board;
Foo(std::vector<std::vector<int>> board) : board(board) {}

如果由于某种原因无法使用std :: vector,那么只有解决方案才能使用int**两种尺寸:

int** board;
size_t s1;
size_t s2;
Foo(int** board = NULL, size_t s1 = 0, size_t s2 = 0) : board(board), s1(s1), s2(s2) {}

但请注意,您不能以这种方式使用:

int board[][] = {{1,1,2},{1,2,2}};
Foo foo((int**)board,2,3);

因为你必须提供一个动态数组:

int** board = new int*[2] { new int[3]{1,1,2}, new int[3]{1,2,2}};

从那以后 - 你必须实现复制构造函数,赋值运算符和析构函数:

Foo(const Foo& other) : TODO { TODO }  
~Foo() { TODO }  
Foo& operator = (Foo other) { TODO }

所以,只需使用std :: vector。