我应该如何正确地使用朋友重载运营商?

时间:2015-12-24 20:19:56

标签: c++ operator-overloading friend

我有一个Matrix类和一个Vector类,它们在头文件中有声明,在自己的源文件中有定义,我想以两种方式重载*运算符。我希望能够写出像

这样的表达式
Matrix m1, m2, m3;
...
m3 = m1 * m2;

以及

等表达式
Vector v1, v2;
Matrix m;
...
v2 = m * v1;

<小时/> 第一次重载似乎很简单,因为它只是Matrix类的成员函数:

class Matrix {
    public:
        Matrix operator*(Matrix &m)
}

摘自matrix.hpp

但是,我不确定在何处/如何声明/定义运算符的其他重载。我以为我需要一个friend函数才能访问这两个类的私有成员,所以我在Vector类中尝试了以下声明:

class Vector {
    public:
        friend Vector operator*(const Matrix &m, const Vector &v);
}

摘自vector.hpp

这似乎遵循我在接受的答案中this question中找到的模式,尽管它是一个不同运算符的重载。但是,当我尝试编译定义重载的源文件时,我会收到错误,因为它无法访问Matrix类的私有成员。

我见过的大多数其他问题和答案都试图重载二元运算符以对同一类的两个实例进行操作,就像我的第一个例子一样,实际上我的链接答案是唯一的地方我&# 39;我看到了类似于我正在做的事情。

那么应如何定义?

编辑:

the possible duplicate状态的已接受答案&#34;仅在需要访问私人成员时才friend。&#34;我确实需要访问私有成员,但我的编译器告诉我,即使在friend之后,我仍然无法访问Matrix的私有成员。

2 个答案:

答案 0 :(得分:4)

除非VectorMatrix类完全不透明(对于使用它们的每个人都不方便),否则不需要将它们定义为成员或朋友。

在任何课程之外,只需将它们作为常规函数实现。

Vector operator*(const Matrix &a, const Vector &b);
Vector operator*(const Vector &a, const Matrix &b);

我建议不要让矢量和矩阵组件不可访问。公开成员变量或提供可用于实现上述功能的operator[]

答案 1 :(得分:-1)

首先,你正在超载错误的运营商。双参数运算符应该总是作为自由函数而不是类成员重载 - 而不是默认为* =运算符。并且不要让他们成为朋友,只需将它们作为常规功能。