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

时间:2012-07-27 05:15:37

标签: c++ operator-overloading private-members

我有这个操作符

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的私有成员。我怎样才能访问它们?

3 个答案:

答案 0 :(得分:4)

Mtx成为Vtr的朋友。

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

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

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

这些更改中的任何一项都可以让您当前的实施工作无需任何进一步更改。

答案 1 :(得分:4)

Mtx成为Vtr的朋友,或者提供对数据的公开评估,例如

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

};

这实际上将数据访问与底层实现分离,因为运算符可以以不同的方式实现。

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

答案 2 :(得分:2)

朋友是你的答案!!

要么你可以使这个班成为朋友或功能。

但我不确定这是否适合你的逻辑。

主要是如果你无法访问一个意味着你不应该访问它的变量。

检查您是否正确使用访问说明符。而唯一的方法是朋友然后使用'朋友'功能或类。