我有一名班级员工
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
class employee
{
public:
double operator + (employee);
istream& operator>> (istream&);
employee(int);
double getSalary();
private:
double salary;
};
int main()
{
employee A(400);
employee B(800);
employee C(220);
cin>>C;
}
employee::employee(int salary)
{
this->salary = salary;
}
double employee::operator + (employee e)
{
double total;
total = e.salary + this->salary;
return total;
}
double employee::getSalary()
{
return this->salary;
}
istream& employee::operator>> (istream& in)
{
in>>this->salary;
return in;
}
我正在尝试重载输入运算符&gt;&gt;读取员工对象,但我收到以下错误
不匹配运营商&gt;&gt;在std :: cin
我做错了什么???
编辑:我知道如何通过朋友功能来实现,我现在正在尝试通过成员函数学习如何做到这一点
答案 0 :(得分:2)
你需要这样声明:
class employee
{
public:
friend std::istream& operator >> (std::istream& is, employee& employee);
}; // eo class employee
实现:
std::istream& employee::operator >> (std::istream& is, employee& employee)
{
is >> employee.salary; // this function is a friend, private members are visible.
return is;
};
作为旁注,在标题文件中通常bad idea来using namespace std;
。
答案 1 :(得分:2)
我知道如何通过朋友功能来实现,我现在正在尝试通过成员函数学习如何实现
你不能。
对于二进制operator@
和对象A a
和B b
,语法a @ b
将调用 表单的非成员函数operator@(A,B)
或 A::operator@(B)
形式的成员函数。没别了。
为了使std::cin >> C
工作,它必须是std::istream
的成员,但由于您无法修改std::istream
,因此无法将operator>>
作为成员实施功能
(除非你想变得奇怪和非传统并且写C << std::cin
或C >> std::cin
,但如果你这样做,其他程序员会讨厌你混淆和非传统。不要这样做。)
答案 2 :(得分:0)
似乎我们无法声明运营商&lt;&lt;内部类声明。我试过了,没关系。
#include <stdio.h>
#include <iostream>
using namespace std;
struct foo {
int field;
};
istream& operator >> (istream& cin, foo& a){
cin >> a.field;
return cin;
}
foo a;
main(){
cin >> a;
}