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。