代码之家  ›  专栏  ›  技术社区  ›  Lunch

友元函数+运算符重载[重复]

  •  0
  • Lunch  · 技术社区  · 10 年前

    我正在为班级做一个项目,这是一种工资单。部分提示显示

    “您可以定义一个重载<<以显示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 
    }
    
    1 回复  |  直到 10 年前
        1
  •  6
  •   Christian Hackl    10 年前

    不要让 << 操作员会让您困惑。过载的操作员在一天结束时 命名函数的另一种方法 .

    如果您有这段代码:

    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<< 返回对流本身的引用。请注意,有两种不同类型的 运算符<&书信电报; 此处涉及: std::string 是一个 free-standing function 拍摄 std::ostream 引用参数,用于 int double 标准::ostream member functions .

    有了这些知识,我们很容易想象,我们只是在处理通常命名的函数,例如“print”:

    int i = 1;
    std::string s = "x";
    double d = 0.5;
    print(std::cout, s).print(i).print(d);
    

    事实上,你可以想象没有 超载,超载 但它们都有不同的名字。这使得整个事情更容易理解:

    int i = 1;
    std::string s = "x";
    double d = 0.5;
    printStringOnStream(std::cout, s).printInt(i).printDouble(d);
    

    如果您想提供 标准::ostream 为自己的班级打印,你所要做的就是像这样 std::字符串 :提供独立式 运算符<&书信电报; 这需要 标准::ostream 引用和对对象的(const)引用,并返回对流的引用:

    std::ostream &operator<<(std::ostream &stream, Employee const &employee)
    {
        // ...
        return stream;
    
    }
    

    现在 // ... 一部分是朋友的作用。为了正确打印 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;