C++ - 2D 数组作为方法参数

C++ - 2D array as an method argument

本文关键字:方法 参数 数组 2D C++      更新时间:2023-10-16

我有类似的类:

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]’

我怎样才能正确地做到这一点?提前感谢您的帮助。

参数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++.您最好不要使用行数组。那是邪恶的。你可以改用 stl 向量。

愿这对你有帮助:)

没有可用的操作可以将一个数组自动分配给另一个数组。

想到的可能解决方法:


使用循环手动将数据复制分配给内部数组(确保跟踪有效nrowsncols)。为了规避编译器的抱怨,您可以使用模板(假设在编译时已知大小):

    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[]动态分配),则可能需要采用此处给出的方法或切换到以下内容。


更好的可能是使用一些标准数组类型,如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