尝试编译代码时出现错误。代码重载了运算符,所有重载的运算符都起作用了,直到我尝试分配副本构造函数为止。我不断收到“ MyClass运算符=(const MyClass&)必须是非静态成员函数”错误。我不明白为什么重载“ =”运算符会导致这样的错误。在.h文件中的声明前面加上“朋友”特殊词不能解决问题。
main.cpp
#include <iostream>
#include "Point.h"
using namespace std;
int main() {
Point point1( 2, 5);
Point point2 = point1;
return 0;
}
MyClass.h
#ifndef POINT_H_
#define POINT_H_
#include <iostream>
#include <cmath>
using namespace std;
class Point {
public:
//Constructor
Point();
Point(const double x, const double y);
//Copy
Point(const Point & t);
//Destructor
virtual ~Point();
//Get the x value
double getX() const;
//Get the y value
double getY() const;
//Set the x value
void setX(double x);
//Set the y value
void setY(double y);
//Return the distance between Points
double distance(const Point& p) const;
//Output the Point as (x, y) to an output stream
friend ostream& operator << (ostream& out, const Point& point);
//Comparison relationships
friend bool operator == (const Point& lhs, const Point& rhs);
friend bool operator < (const Point& lhs, const Point& rhs);
//Math operators
friend Point operator + (const Point& lhs, const Point& rhs);
friend Point operator - (const Point& lhs, const Point& rhs);
Point& operator = (const Point& rhs);
private:
double x;
double y;
};
#endif /* POINT_H_ */
MyClass.cpp
// Get the x value
double Point::getX() const {
return x;
}
// Get the y value
double Point::getY() const {
return y;
}
void Point::setX(double x) {
this->x = x;
}
void Point::setY(double y) {
this->y = y;
}
// Return the distance between Points
double Point::distance(const Point& p) const{
return abs( sqrt( pow( (x - p.getX() ), 2 ) + pow( (y - p.getY() ), 2 ) ) );
}
ostream& operator << (ostream& out, const Point& point){
out << point.getX() << ", " << point.getY();
return out;
}
bool operator == (const Point& lhs, const Point& rhs){
if(lhs.x == rhs.x && lhs.y == rhs.y){ return true; }
return false;
}
bool operator < (const Point& lhs, const Point& rhs){
if(lhs.x < rhs.x && lhs.y < rhs.y){ return true; }
return false;
}
Point operator + (const Point& lhs, const Point& rhs){
Point point;
point.x = lhs.x + rhs.x;
point.y = lhs.y + rhs.y;
return point;
}
Point operator - (const Point& lhs, const Point& rhs){
Point point;
point.x = lhs.x - rhs.x;
point.y = lhs.y - rhs.y;
return point;
}
Point& Point::operator = (const Point& rhs){
x = rhs.x;
y = rhs.y;
return *this;
}
// Destructor
Point::~Point(){}
答案 0 :(得分:2)
这里有很多问题,我将一一解决。
关于您的主要问题,由于复制赋值运算符在MyClass
的范围内定义,因此您还需要将其定义写在MyClass
的范围内,只需添加{{1 }},就像在其他作用域中一样。接下来,您实际上应该将MyClass::
的数据复制到rhs
中,并且应该返回对this
的引用。
*this
如果将MyClass& MyClass::operator=(const MyClass& rhs){
x = rhs.x;
y = rhs.y;
return *this;
}
复制到一个临时文件中并返回它,则复制分配的整个语义将被完全破坏。它将导致如下情况:
rhs
还请注意,这是一个琐碎的复制构造函数,可以完全删除它,以使编译器将为您隐式生成一个相同的成员副本,在这种情况下,这是完全安全的。参见special member functions。
在MyClass obj1 {999.0, 2468.0};
MyClass obj2 {0.0, 0.0};
obj2 = obj1; // should copy obj1 to obj2
cout << obj2.x << " " << obj2.y << '\n'; // outputs "0.0 0.0" ??!?!?
函数体中,有以下几行:
operator+
您可能是指MyClass myVar;
MyClass.x = lhs.x + rhs.x;
MyClass.y = lhs.y + rhs.y;
return myVar;
和myVar.x
。 myVar.y
仅引用类型,而尝试访问MyClass
是毫无意义的声明。
通常,永远不要像在当前实现中那样返回对临时对象的引用。函数返回时,本地对象将被销毁,这给您留下了对已销毁对象的悬挂引用,该对象的内存很可能在不久的将来被完整的垃圾覆盖。 Here是正在发生的事情的很好的解释。
让我知道您是否在遇到任何其他问题或阅读链接后仍不清楚。编码愉快!