什么类型有多维数组

What type have multidimensional array?

本文关键字:数组 类型 什么      更新时间:2023-10-16

我正在编写自己的2d矩阵类。我想把这门课的用法设计得更接近真实的数学符号。例如,我希望以矩阵[3,6]的形式访问元素。但c++没有提供这种能力,但我可以通过下一种方式访问基础多维数组:

int matrix[2][2] = {};
int val = matrix[1][0];

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

template <typename ValType>
class Matrix2D
{
protected:
ValType m_data[2][2] = {};
public:
ValType** operator()()  // <--- what type?
{
return m_data;
}
}

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

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

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

由于它被标记为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];
}
};

通过这种方式,您可以只写matrix[1][0],而不必写matrix()[1][0](坦率地说,这看起来像是一个拼写错误)。

此外,如果你喜欢同时进行两个索引,你可以写信给你的呼叫接线员,简单地同时进行这两个索引:

ValueType& operator()(size_t x, size_t y) {
return m_data[x][y];
}

这将允许您将matrix(1, 0)作为matrix[1][0]的替代方案。

2D数组衰减为指向其第一行的指针。以下内容应该有效:

typedef ValType Line[2];
Line* operator()()
{
return m_data;
}

你可以用类似的方式进行索引:

ValType* operator[](int line)
{
return m_data[line];
}

您将选择的类型取决于您。:)例如

ValType ( * operator()() )[2] 
{
return m_data;
}

当一个数组由函数的值返回时,它被隐式转换为指向其第一个元素的指针。你有一个像一样声明的二维数组

ValType m_data[2][2] = {};

因此,它的元素又是一个类型为ValType[2]的一维数组。因此,指向这样一个对象(数组的第一个元素)的指针将像一样声明

ValType ( *p )[2] = m_data;

ValType ( & operator()() )[2][2] 
{
return m_data;
}

在这种情况下,函数返回对数组的引用。函数本身可能不会返回数组,但它们可能会返回对数组的引用。您可以通过以下方式使用功能

ValType( &a )[2][2] = obj(); // where obje is an object of the template class

或者你可以写更简单的

auto &a = obj();

甚至类似

ValType ( * operator()() )[2][2] 
{
return &m_data;
}

除了函数返回一个指向整个数组的指针之外,这个用例看起来与第一个用例类似。


当然,在这三种情况下,您都可以使用一些使代码更简单的typedef。但无论如何,你需要知道我展示的合成器。

请注意,类定义的右大括号后面必须有一个分号。:)