带有操作符重载的c++矩阵类

C++ Matrix Class with Operator Overloading

本文关键字:c++ 操作符 重载      更新时间:2023-10-16

我正在实现一个小的密集矩阵类,而不是计划get/set操作符,我想使用操作符重载,使API更可用和一致。

我想达到的目标很简单:

template<typename T>
class Matrix
{
public:
    /* ... Leaving out CTOR and Memory Management for Simplicity */
    T operator() (unsigned x, unsigned y){/* ... */ }
};

Matrix<int> m(10,10);
int value = m(5,3); // get the value at index 5,3
m(5,3) = 99; // set the value at index 5,3

虽然通过重载operator()可以直接获得值,但我无法理解如何定义setter。根据我的理解,操作符优先级将在赋值之前调用operator(),但是不可能重载operator()以返回正确的左值。

解决这个问题的最好方法是什么?

我不同意"it's not possible"去做正确的事情:

struct Matrix
{
  int & operator()(size_t i, size_t j) { return data[i * Cols + j]; }
  const int & operator()(size_t i, size_t j) const { return data[i * Cols + j]; }
  /* ... */
private:
  const size_t Rows, Cols;
  int data[Rows * Cols];  // not real code!
};

现在你可以说,m(2,3) = m(3,2) = -1;

你的问题的答案是Kerrek已经说过的:你可以通过改变操作符的签名来提供重载,在这种情况下,可以通过修改函数的const-ness来实现。

但是我建议您至少考虑为这些值提供一个单独的setter。原因是,一旦返回对内部数据结构的引用,就失去了对外部代码对数据所做操作的控制。也许是好的在这种情况下,但考虑,如果你决定添加范围验证实现(即确认没有价值上面的矩阵X或Y)以下,或者希望优化计算的矩阵(说的和所有的元素在矩阵是一个经常检查值,你想优化掉预缓存值的计算和更新每个字段变化),这是更容易控制的方法设置接收价值。