我有以下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。我是在错误的位置声明了朋友功能还是在错误的位置提供了实现?
答案 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)
允许在类中定义朋友功能。这样做会使它们内联。
一个完全在类/结构/联合定义内部定义的函数,无论是成员函数还是非成员朋友函数,都隐式为内联函数。
如果这样做,则可以避免多定义问题。