我的班级与此相似:
class Krzyzowka
{
protected:
char model[40][40];
int x, y;
public:
Krzyzowka() { }
Krzyzowka(char model[][40], int x, int y)
{
this->model=model;
}
};
现在,我在main()中声明:
char array[10][10];
并希望将其传递给:
Krzyzowka(char model[][40], int x, int y)
我这样做:
Krzyzowka obj(array, 10, 10);
但后来我想用传递的数组设置模型2D数组:
this->model=model;
但编译器会返回两个错误:
error: no matching function for call to ‘Krzyzowka::Krzyzowka(char [10][10], int, int)’
error: incompatible types in assignment of ‘char (*)[40]’ to ‘char [40][40]’
我该如何正确地做到这一点?在此先感谢您的帮助。
答案 0 :(得分:2)
参数char model[][40]
只能用于parameter[x][40]
等数组。
如果你真的想将任何行数组传递给方法,可以使用指针:
class Krzyzowka
{
protected:
char **pp_model;
int x, y;
public:
Krzyzowka() { }
Krzyzowka(char **pp_model, int x, int y)
{
this->pp_model = pp_model;
// do not miss follow two line
this->x = x;
this->y = y;
}
};
然后,您可以传递char **
参数来实例化对象,而不是使用char array[x][y]
。
现在您使用c++
。你最好不要使用行数组。那是evil。你可以改用stl向量。
可能对你有所帮助:))
答案 1 :(得分:0)
没有可用的操作自动将数组分配给另一个数组。
想到的可能的解决方法:
使用循环手动复制 - 将数据分配到内部数组(确保跟踪有效的nrows
和ncols
)。为避免编译器投诉,您可以使用模板(假设在编译时已知大小):
template<int NROWS, int NCOLS>
Krzyzowka(char (&model)[NROWS][NCOLS])
{
nrows = NROWS > nrows ? nrows : NROWS;
ncols = NCOLS > ncols ? ncols : NCOLS;
for (int row = 0; row < nrows; row++)
for (int col = 0; col < ncols; col++)
this->model[row][col] = model[row][col];
}
现在您可以创建如下对象:
char array[][2] = {{'a', 'b'}, {'c', 'd'}};
Krzyzowka k(array);
如果数组的维度仅在运行时已知(例如,基于用户输入,并且char** array
由嵌套的new[]
动态分配),则可能需要采用方法{{3} }或切换到以下内容。
更好的方法可能是使用一些标准数组类型,例如std::vector
(您可以交换或分配)。那么编译器类型不兼容性投诉也没有问题。
std::vector<std::vector<char> > array(nrows, std::vector<char>(ncols));
std::vector<std::vector<char> > model;
model = array; // or model.swap(array); if you don't need the copy