将二维数组作为 class 参数传递

Passing 2D array as class parameter

我正在尝试设置一个 class,它在编译时使用未知大小的二维数组进行初始化。我认为最好的方法是将数组作为指针传递。这对 1d 数组按预期工作,但是当我尝试对 2d 数组执行相同操作时。我收到一条错误消息,指出它无法将参数 2 从 'char [3][3]' 转换为 'char*'。有没有人对我如何让它工作有简单的解释?这是我的代码。

TestClass.h:
#pragma once
#include <iostream>

class TestClass
{
public:

    std::string name;
    char *data;
    TestClass(std::string name, char *data);
};
TestClass.cpp:
#include "TestClass.h"

TestClass::TestClass(std::string name, char *data)
{
    this->name = name;
    this->data = data;
}
Main.cpp:
#include "TestClass.h"

int main()
{
    char TestArray[3][3] = {{ 'A', 'B', 'C' },
                            { 'D', 'E', 'F' },
                            { 'G', 'H', 'I' }};

    TestClass Test("TestName", TestArray);
    std::cout << Test.data[2] << std::endl;

    return 1;
}

您可以通过传递第一个元素的地址来传递一个二维数组:

TestClass Test("TestName", &TestArray[0][0]);

但是 TestClass 应该如何知道数组的维度呢?没有办法查询数据或猜测。您还必须通过 num_rowsnum_cols.

但后来我看到:

std::cout << Test.data[2] << std::endl;

所以现在您希望二维数组成为 C-style 字符串的一维数组?那不是你的数据所代表的。

您真的应该忘掉所有 C-style 垃圾并使用现代 C++ 构造。使用 std::vector<std::string> 存储可变数量的字符串。

问题是构造函数的第二个参数是char*类型,但你传递的是一个二维数组TestArray,它将decaychar (*)[3] 并且因为没有从 char(*)[3]char* 的隐式转换,所以你得到了提到的错误。

解决这个问题,您可以将构造函数的第二个参数设为指向大小为 3 的数组的指针(但随后您还将拥有更改 data) 的类型或更好地使用 std::vectorstd::string.