在重载运算符中访问另一个类的数据成员

Access data members of another class in overloading operator

本文关键字:数据成员 另一个 访问 重载 运算符      更新时间:2023-10-16

我有这个操作员

Mtx Mtx::operator*(const Vtr &rhs) const
{
Mtx Q(nrows, ncols, 0);
for (int i = 0; i < nrows; ++i) {
    for (int j = 0; j < ncols; ++j) {
        Q.ets[i][j] = 0.0;
        for (int k = 0; k < rhs.length; ++k) {
            Q.ets[i][j] += ets[i][k] * rhs.ets[k];
        }
    }
  }
return Q;
}

我用M3 = M1 * V1调用这个运算符,我收到编译器错误,因为第三个循环中的lengthets[k]是类Vtr的私有成员。如何访问它们?

要么让Mtx成为Vtr的朋友,要么对数据进行公开评估,例如

class Vtx {
 public:
  const SomeType& operator[](unsigned int i) const { return ets[i]; }
};

这实际上将数据访问与底层实现解耦,因为操作符可以用不同的方式实现。

另一方面,它提供了对底层表示的直接访问,因此它添加了一个约束,即不能以更改给定索引和给定元素之间映射的方式更改实现。

Mtx成为Vtr的朋友。

 class Vtr {
     friend class Mtx;
     //...
 };

或者让Mtx::operator*方法成为朋友。

 class Vtr {
     friend Mtx Mtx::operator*(const Vtr &) const;
     //...
 };

这两项更改中的任何一项都将使您当前的实现能够正常工作,而不会有任何进一步的更改。

朋友是你的答案!!

你可以让这个类成为朋友,也可以让函数成为朋友。

但我不确定这是否是你案件的正确逻辑。

大多数情况下,如果你不能访问一个变量,那就意味着你不应该访问它

检查访问说明符的使用是否正确。唯一的方法是friend,然后使用"friend"函数或类。