C++ 在重载运算符中访问另一个类的数据成员
我有这个接线员C++ 在重载运算符中访问另一个类的数据成员,c++,operator-overloading,private-members,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.
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的朋友
或者让Mtx::operator*方法成为朋友
class Vtr {
friend Mtx Mtx::operator*(const Vtr &) const;
//...
};
这些更改中的任何一项都将使您当前的实现工作,而无需任何进一步的更改。让Mtx成为Vtr的朋友
或者让Mtx::operator*方法成为朋友
class Vtr {
friend Mtx Mtx::operator*(const Vtr &) const;
//...
};
这些更改中的任何一项都可以让您当前的实现工作,而无需任何进一步的更改。朋友是您的答案 您可以使类成为朋友或函数 但我不确定这是否是你这个案子的正确逻辑 大多数情况下,如果你不能访问一个变量,这意味着你不应该访问它
检查您是否正确使用访问说明符。唯一的方法是使用friend函数或类 朋友就是你的答案 您可以使类成为朋友或函数 但我不确定这是否是你这个案子的正确逻辑 大多数情况下,如果你不能访问一个变量,这意味着你不应该访问它 检查您是否正确使用访问说明符。唯一的方法是使用friend函数或类 例如,让Mtx成为Vtr的朋友或提供对数据的公共评估
class Vtx {
public:
const SomeType& operator[](unsigned int i) const { return ets[i]; }
};
这实际上将数据访问与底层实现分离,因为操作符可以以不同的方式实现
另一方面,它提供了对底层表示的直接访问,因此它添加了一个约束,即您不能以改变给定索引和给定元素之间映射的方式来更改实现。例如,让Mtx成为Vtr的朋友或提供对数据的公共评估
class Vtx {
public:
const SomeType& operator[](unsigned int i) const { return ets[i]; }
};
这实际上将数据访问与底层实现分离,因为操作符可以以不同的方式实现
另一方面,它提供了对底层表示的直接访问,因此,它增加了一个约束,即您不能以改变给定索引和给定元素之间映射的方式来更改实现。+1用于两点:或者您可以使类成为朋友,或者函数+1用于两点:或者您可以使类成为朋友,或者函数I使其成为朋友,并且成功了。但是上面的代码不起作用。有什么隐藏的吗?访问者需要公开。OP的代码需要更改为直接在rhs上使用[]。另外,需要一个长度存取器。这可能是公共问题吗?除此之外,希德尼并没有刻意让它成为朋友,它成功了。但是上面的代码不起作用。有什么隐藏的吗?访问者需要公开。OP的代码需要更改为直接在rhs上使用[]。另外,需要一个长度存取器。这可能是公共问题吗?否则,就不会有任何刻意隐藏的东西