在重载运算符中访问另一个类的数据成员
Access data members of another class in overloading operator
我有这个操作员
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"函数或类。
相关文章:
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- C++:成员不可访问-使用友元函数允许一个类修改另一个类的成员数据
- 返回带有另一个类的数据成员的构造函数?遇到转换错误?
- 从一个类的数据成员的值从另一个类更改
- 从其后声明的另一个成员数据初始化成员数据是否为未定义行为
- 从另一个命名空间访问标准命名空间数据成员
- 是否有必要重载具有另一个类 B 的数据成员的类 A 的赋值运算符和复制构造函数?
- 静态const数据成员在另一个文件中定义
- 将映射的每个键中的数字数据与另一个数值进行比较
- 如何在C 中的另一个对象的同一数据成员中输入另一个字符串
- 非静态数据成员和一个定义规则
- 如何创建一个将队列作为数据成员的类,该成员在 c++ 中存储另一个类的实例
- 参考数据会在const函数中更改另一个数据成员
- 在C++中,"static initialization fiasco"是否仅影响对另一个模块中定义的对象的数据成员的引用?
- 在重载运算符中访问另一个类的数据成员
- 并集:从并集的一个数据成员中读取数据,然后写入另一个
- 如何在另一个类数据成员上定义“std::set”排序
- 作为另一个类的数据成员的类
- C++访问另一个类的数据成员
- 为数据成员分配一个新的随机方向,该方向不同于 c++ 中的当前方向