我真的绊倒了运营商重载。我在这里有一个简单的操作重载加法(+),但它在我的班级中找到了一个没有全局运算符。
有人可以解释为什么会发生这种情况,我该如何解决?
错误消息 :
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;
}
非常感谢你!
答案 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 constructor
和destructor
。就像class Add
的情况一样,你可以把它们留下来让编译器为你生成它们。