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上使用[]。另外,需要一个长度存取器。这可能是公共问题吗?否则,就不会有任何刻意隐藏的东西