C ++复制函数重载导致“必须为非静态成员函数”错误

时间:2018-09-30 05:40:05

标签: c++ constructor copy overloading

尝试编译代码时出现错误。代码重载了运算符,所有重载的运算符都起作用了,直到我尝试分配副本构造函数为止。我不断收到“ 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(){}

1 个答案:

答案 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.xmyVar.y仅引用类型,而尝试访问MyClass是毫无意义的声明。


通常,永远不要像在当前实现中那样返回对临时对象的引用。函数返回时,本地对象将被销毁,这给您留下了对已销毁对象的悬挂引用,该对象的内存很可能在不久的将来被完整的垃圾覆盖。 Here是正在发生的事情的很好的解释。


让我知道您是否在遇到任何其他问题或阅读链接后仍不清楚。编码愉快!