其他分享
首页 > 其他分享> > 在c中重写operator <<

在c中重写operator <<

作者:互联网

我正在为我在C的学校做一个项目

我有2节课:Employe和Teacher.
源自Employe的老师,其职能已被覆盖.

我们覆盖运算符<<打印一些雇员或教师的信息.
每个类都有一个const int属性LevelAcces_.
对于Employe,是5,对于Teacher,是20.

当我在main.cpp中创建教师时,我调用了operator<<教师打印他的信息.
所以这个函数叫做:

ostream& operator<<(ostream& os, const Teacher& pTeacher){
    os << (pTeacher);
    return os;
}

但是,该函数使用“ os<<(pTeacher);”行来调用自身.并执行导致堆栈溢出的循环. 我希望行“ os<<(pTeacher)”调用运算符<<我班的Employe,而不是我班的老师. 覆盖运算符<<在Employe中:

ostream& operator<<(ostream& os, const Employe& pEmploye){
    os << "Name: " << pEmploye.name_ << endl;
    os << "Class: " << pEmploye.getClass() << endl;
    os << "LevelAcces: " << pEmploye.getLevelAccess() << endl;
    return os;
}

我试图将我的老师放到Employe中,但是当它显示消息时,LevelAcces是5(我想是20,因为我的Employe是一位老师).

我还尝试使用Employe :: operator<<但是运算符<<不是Employe的成员,所以它不起作用... 所以,这是我的问题: 我该怎么做才能使用我的运算符<<我的运算符中的Employe的<<并打印正确的信息(LevelAccess = 20,而不是5)? 我也想到了“虚拟”,但我们的教授告诉我们,不需要使用这个词. 提前致谢 :) 这是更完整的代码: main.cpp中:

Teacher Garry("Garry");
cout << Garry << endl;

Employe.cpp:

#include "Employe.h"

using namespace std;

Employe::Employe(){
    name_ = "";
}

Employe::Employe(string pName){
    name_ = pName;
}

string Employe::getName() const{
    return name_;
}

unsigned int Employe::getLevelAccess() const{
    return levelAccess_;
}

string Employe::getClass() const{
    return typeid(*this).name();
}

ostream& operator<<(ostream& os, const Employe& pEmploye){
    os << "Name: " << pEmploye.name_ << endl;
    os << "Class: " << pEmploye.getClass() << endl;
    os << "LevelAcces: " << pEmploye.getLevelAccess() << endl;
    return os;
}

在Employe.h中:

private:
    static const unsigned int LevelAccess_ = 5;

Teacher.cpp:

#include "teacher.h"
using namespace std;

Teacher::Teacher(string pName){
    nom_ = pName;
}

unsigned int Teacher::getLevelAccess() const{
    return(Employe::getLevelAccess() + accessTeacher_); 
}
string Teacher::getClass() const{
    return typeid(*this).name();
}

ostream& operator<<(ostream& os, const Teacher& pTeacher){
        os << (pTeacher);
        return os;
}

这是Teacher.h:

static const unsigned int accesTeacher_ = 15;

解决方法:

我要做的是:仅定义一个

ostream& operator<<(ostream& os, const Employe& pEmploye)
{
    return pEmploye.display(os);
}

对于层次结构的基础,
在其中调用受保护的成员函数virtual display(),该函数被每个派生类覆盖,并且将显示委托给该成员.这有时称为NVI(非虚拟接口)惯用语.它是这样的:

class Employee
{
    // ...
    friend ostream& operator<<(ostream& os, const Employee& pEmployee)
    {
        return pEmployee.display(os);
    }
protected:
    virtual ostream& display(ostream& os) const
    {
        // implement it here
        return os;
    }
};

class Teacher: public Employee
{
    // ....
protected:
    ostream& display(ostream& os) const override
    {
        // implement it here
        return os;
    }
};

标签:c,operator-overloading,inheritance
来源: https://codeday.me/bug/20191011/1890465.html