使用C ++中的好友函数进行运算符重载

时间:2018-08-14 00:40:15

标签: c++ operator-overloading friend

我有以下Point类。

#ifndef POINT_HPP
#define POINT_HPP

#include <string>

class Point {

private:

    double m_x, m_y;

public:

    Point();
    Point(double x, double y);
    Point(const Point &p);

    ~Point();

    // selectors
    double X() const;
    double Y() const;
    std::string ToString() const;
    double Distance() const;
    double Distance(const Point &p) const;

    // modifiers
    void X(double x);
    void Y(double y);

    Point operator - () const; // Negate coordinates
    //Point operator * (double factor) const; // Scale the coordinates.
    Point operator + (const Point & p) const; // Add coordinates.
    bool operator == (const Point & p) const; // equally compare 
operator.

    Point& operator = (const Point& source);
    Point& operator *= (double factor);

    // non member function to facilitate commutative 
multiplication
    friend Point operator * (double factor, const Point & p);
    friend Point operator * (const Point & p, double factor);

};

Point operator * (double factor, const Point & p) {
    return Point(p.m_x * factor, p.m_y * factor);
}

Point operator * (const Point & p, double factor) {
    return factor * p;
}

#endif //POINT_HPP

创建两个Point对象并尝试与已实现的*运算符进行乘法时。我收到多个定义错误。我相信我的*运算符已重载为,因此我可以按任意顺序执行double * Point对象和Point object * double。我是在错误的位置声明了朋友功能还是在错误的位置提供了实现?

2 个答案:

答案 0 :(得分:2)

如果函数是在多个.cpp文件中包含的头文件中定义的,则需要标记为inline。要么将定义(实现)移动到.cpp文件中。每个包含头文件的.cpp文件都以它现在的方式创建一个定义,当它们都链接在一起时,便有了“多个定义”

inline Point operator * (double factor, const Point & p) {
    return Point(p.m_x * factor, p.m_y * factor);
}

inline Point operator * (const Point & p, double factor) {
    return factor * p;
}

答案 1 :(得分:2)

允许在类中定义朋友功能。这样做会使它们内联。

来自CPP reference

  

一个完全在类/结构/联合定义内部定义的函数,无论是成员函数还是非成员朋友函数,都隐式为内联函数。

如果这样做,则可以避免多定义问题。