二进制' + =' :没有发现哪种全局运算符采用了类型'添加' C ++

时间:2015-05-11 07:56:49

标签: c++ operator-overloading operator-keyword

我真的绊倒了运营商重载。我在这里有一个简单的操作重载加法(+),但它在我的班级中找到了一个没有全局运算符。

有人可以解释为什么会发生这种情况,我该如何解决?

错误消息

1>------ Build started: Project: exercise 2, Configuration: Debug Win32 ------
1>Compiling...
1>Add.cpp 1>c:\documents and settings\...\exercise 2\add.cpp(15) :
    error C2677: binary '+=' : no global operator found which takes type 'Add' (or there is no acceptable conversion)
1>Build log was saved at "file://c:\Documents and Settings\...\Debug\BuildLog.htm" 
1>exercise 2 - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Add.h

#ifndef ADD_H
#define ADD

class Add{
public:
    Add(int = 0);   //default constructor
    Add(Add &);     //copy constructor
    ~Add();         //destructor

    Add operator+(Add &);
private:
    int num;
};

#endif

Add.cpp

#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;

#include "Add.h"

Add::Add(int x){
    num = x;
}

Add Add::operator +(Add &y){
    Add x = *this;
    x.num += y;
    return x;
}

非常感谢你!

2 个答案:

答案 0 :(得分:3)

您正尝试向Add添加int。将x.num += y更改为x.num += y.num

此外,operator+通常最适合作为对称性的独立函数。

答案 1 :(得分:3)

当您为类重载+=运算符时,+运算符不会自动重载,例如在C#中。你必须自己定义它。对于-=等也是如此。

您需要将+=运算符定义为成员函数,并返回对操作的实例的引用:

Add& Add::operator += (const Add& rhs) {
    num += rhs.num;
    return *this;
}

您的+运算符应该是非成员,并返回表示操作结果的新实例:

Add operator + (const Add& lhs, const Add& rhs) {
    return Add(lhs.num + rhs.num);
}

此外,在Add.h

#ifndef ADD_H
#define ADD         // should be ADD_H

// in Add:
    Add(Add &);     // should use 'const Add&'

此外,如果他们不做任何特别的事情,您无需定义自己的copy constructordestructor。就像class Add的情况一样,你可以把它们留下来让编译器为你生成它们。