我正在编写自己的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**'
我理解错误,但不知道我必须改变什么来避免这个错误?该函数必须返回什么类型?
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)
由于这是标记的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].