c++ - 使用括号运算符实现矩阵类的安全方法

标签 c++ operator-overloading

我正在为此编写一个二维矩阵类,包装一个 vector vector 。

由于矩阵必须具有正维度,我确保矩阵不会构造错误,从那时起我假设矩阵至少有一个元素:

Matrix2D::Matrix2D(size_t rows, size_t cols)
{
    if (rows == 0 || cols == 0)
    {
        throw std::invalid_argument("Matrix cannot have zero as dimension");
    }
    ...

我想通过使用连接的 [] 为用户提供一种访问和修改特定元素的方法(即 m[1][1] )。但是,我不希望用户能够修改矩阵的维度或修改一行中的列数。我目前提供重载的方法 operator[]像下面这样是不够的,因为用户可以使用非常量版本(修改特定元素所必需的)来修改列数:

std::vector<double>& operator[](size_t r);
const std::vector<double>& operator[](size_t r) const;

通过做 m[0] = std::vector<double>(0) .

有没有办法在保持双括号语法的同时防止这种垮台?

我知道我可以使用 operator()喜欢m(1, 1) , 但我对尝试使用双括号语法感到好奇。

最佳答案

你的 operator[]可以用 operator[] 返回一个代理对象定义。像这样:

class Matrix2D
{
  std::vector<std::vector<double>> rows;

  class Proxy
  {
    friend class Matrix2D;

    std::vector<double> &v;

    Proxy(std::vector<double> &v) : v(v) {}

  public:
    double& operator[] (size_t c) const { return p[c]; }
  };

public:
  Proxy operator[] (size_t r)
  {
    return { rows[r]; }
  }
};

但是请注意,使用 vector 的 vector 来表示 2D 矩阵通常不是一个好主意,因为它对缓存非常不友好。如果你只存储一个 std::vector<double>,它会更接近实际可用性。尺寸rows * cols并手动对其进行索引。

关于c++ - 使用括号运算符实现矩阵类的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48297422/

相关文章:

python - boost .Python : inheret from C++ object in python: Cannot add to C++ base class list

c++ - 为什么我不能定义一个一元运算符,然后在 MSVC 的模板类中声明一个同名的友元二元运算符?

c++ - 未定义的类型特征引用

c++ - 使用自定义转换运算符向上转换到模板类

c++ - 迭代器和 const_iterator operator++ post and prefix

c++ - 如何*正确*地将 std::string 转换为无符号 char[] 数组。我想我做错了,有人指出我正确的方向吗?

c++ - 如何为 llvm IR 调用指令创建结构参数?

c++ - 为什么在 gcc 库中重复声明相同的类型

java - 如何从 C++ 调用 Java 函数?

c++ - 小于运算符不能作为成员函数重载