我有这个操作员
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
调用这个运算符,我收到编译器错误,因为第三个循环中的length
和ets[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"函数或类。