什么类型有多维数组?

Aer*_*Sun 2 c++ arrays c++11

我正在编写自己的2d矩阵类.我想设计这个类的使用非常接近真正的数学符号.例如,我想访问元素作为矩阵[3,6].但是c ++并没有提供这种能力,但我可以通过下一种方式访问​​基本的多维数组:

int matrix[2][2] = {};
int val = matrix[1][0];
Run Code Online (Sandbox Code Playgroud)

所以我决定创建返回基数组的函数.对于这个角色,最好的函数是operator().所以我可以通过下一个方式访问:matrix()[1] [0].好的,我开始实施它并坚持:(.看看我有什么:

template <typename ValType>
class Matrix2D
{
protected:
    ValType m_data[2][2] = {};

public:
    ValType** operator()()  // <--- what type?
    {
        return m_data;
    }
}
Run Code Online (Sandbox Code Playgroud)

但我在上面的函数中收到了编译器错误

错误C2440:'return':无法从'double [2] [2]'转换为'double**'

我理解错误,但不知道我必须改变什么来避免这个错误?该函数必须返回什么类型?

fre*_*low 6

2D阵列衰减到指向其第一个"线"的指针.以下应该有效:

typedef ValType Line[2];

Line* operator()()
{
    return m_data;
}
Run Code Online (Sandbox Code Playgroud)

您可以以类似的方式使索引工作:

ValType* operator[](int line)
{
    return m_data[line];
}
Run Code Online (Sandbox Code Playgroud)


Bar*_*rry 6

由于这是标记的C++ 11,您应该使用std::array.并使用索引运算符,而不是调用运算符:

template <typename ValType>
class Matrix2D
{
protected:
    using Row = std::array<ValType, 2>;
    std::array<Row, 2> m_data;

public:
    Row& operator[](size_t idx)
    {
        return m_data[idx];
    }
};
Run Code Online (Sandbox Code Playgroud)

这样你就可以写matrix[1][0]而不必写matrix()[1][0] (坦率地说,这看起来像一个错字).

此外,如果您希望同时执行两个索引,则可以编写调用运算符以简单地同时执行以下操作:

ValueType& operator()(size_t x, size_t y) {
    return m_data[x][y];
}
Run Code Online (Sandbox Code Playgroud)

这将允许您matrix(1, 0)作为替代matrix[1][0].