我正在为一个项目工作,这是一种工资单。提示的一部分说
“您可以定义一个重载<<用于显示Employee对象信息的友元函数(即重载<<函数将调用虚拟打印函数。)”
我知道朋友的功能是什么,但我不记得了解过载<<部分。我试着寻找一些简单的复制粘贴实现...但无论我尝试什么,我的编译器都会爆发。
我如何实际实施此功能?这是我到目前为止的代码:
#include <iostream>
#include <string>
using namespace std;
//Base class
class Employee
{
public:
Employee(string a, string b, string c, string d);
~Employee();
int virtual earnings();
void virtual print();
protected:
string first, last, brithday, department;
};
Employee::Employee(string f, string l, string b, string d)
{
first = f;
last = l;
brithday = b;
department = d; //department code
cout << "Employee created." << endl;
}
Employee::~Employee(void)
{
cout << "Employee deleted." << endl;
}
int Employee::earnings()
{
int earnings = 100; //To be added
return earnings;
}
void Employee::print()
{
//IDK
}
答案 0 :(得分:6)
不要让<<
操作员混淆你。在一天结束时,重载的运算符只是命名函数的另一种方式。
如果你有这段代码:
int i = 1;
std::string s = "x";
double d = 0.5;
std::cout << s << i << d;
然后这只是另一种说法:
int i = 1;
std::string s = "x";
double d = 0.5;
std::operator<<(std::cout, s).operator<<(i).operator<<(d);
顺便说一下,链接调用更加明显,因为operator<<
返回对流本身的引用。请注意,此处涉及两种不同类型的operator<<
:std::string
的{{1}}是free-standing function引用std::ostream
引用参数,int
和double
std::ostream
是int i = 1;
std::string s = "x";
double d = 0.5;
print(std::cout, s).print(i).print(d);
member functions。
有了这些知识,我们很容易想象,我们只会处理通常命名的函数,例如: “打印”:
int i = 1;
std::string s = "x";
double d = 0.5;
printStringOnStream(std::cout, s).printInt(i).printDouble(d);
事实上,你可以想象没有重载,但它们都有不同的名称。这使整个事情更容易理解:
std::ostream
如果您想为自己的课程提供std::string
打印,您只需执行operator<<
:提供一个独立的std::ostream
,其中std::ostream &operator<<(std::ostream &stream, Employee const &employee)
{
// ...
return stream;
}
引用和对象的(const)引用,它返回对流的引用:
// ...
现在Employee
部分是朋友的事情发挥作用的地方。为了正确打印operator<<
,您需要访问其所有私人成员。提供此访问权限而不向公众公开的最简单方法是声明Employee
class Employee
{
// ...
friend std::ostream &operator<<(std::ostream &stream, Employee const &employee);
};
std::ostream &operator<<(std::ostream &stream, Employee const &employee)
{
stream << employee.earnings; // and so on
return stream;
}
的朋友:
std::cout << "xyz" << my_employee << "abc" << 0.5 << 1;
你去,为你的员工完美打印:
{{1}}