从子类构造函数中构造基类时出现问题



我有两个类。由于博士将被视为雇员,我应该在博士类中使用雇员类函数。Doctor类唯一额外的东西是TITLE。基本上,我尝试的是将值发送到Doctor的构造函数,设置标题,然后将剩余值发送到Employee的类;然而,我不能。这就是我迄今为止所做的,

员工.h

#ifndef EMPLOYEE_H
#define EMPLOYEE_H
class Employee {
private:
int ID;
char *firstname;
char *lastname;
int telno;
char *adress;
char *mail;
int salary; 
public:
Employee();
Employee(int,char *,char*,int,char*,char*,int);
char* getfmame();
char* getlname();
char* getadress();
char* getmail();
int getID();
int gettel();
int getsalary();
void printall();
};
#endif

员工.cpp

#include <iostream>
#include "employee.h"
using namespace std;
Employee::Employee() {
firstname = "Empty";
ID=0;
firstname="Empty";
lastname="Empty";
telno=0;
adress="Empty";
mail="Empty";
salary=0; 
}
Employee::Employee(int id,char * first,char* last,int tell,char* adres,char* email,int salar){
ID=id;
firstname=first;
lastname=last;
telno=tell;
adress=adres;
mail=email;
salary=salar;
}
char* Employee::getfmame(){ return firstname; }
char* Employee::getlname(){ return lastname; }
char* Employee::getadress(){ return adress; }
char* Employee::getmail(){ return mail; }
int Employee::getID(){ return ID; }
int Employee::gettel(){ return telno; }
int Employee::getsalary(){ return salary; }
void Employee::printall(){
cout<<endl<<"EMLOYEE INFORMATION"<<endl<<"------------------"<<endl;
cout<<endl<<"ID :"<<ID<<endl<<"FIRST NAME: "<< firstname <<endl<<"LAST NAME: "<< lastname << endl << "TELEPHONE NUMBER: "<<telno<<endl<<"ADRESS: "<<adress<<endl<<"MAIL: "<<mail<<endl<<"SALARY: "<<salary<<endl;
}

Doctor.h

#ifndef DOCTOR_H
#define DOCTOR_H
#include "Employee.h"
using namespace std;
class Doctor :Employee {
public:
enum title {Intern=0,Practitioner=1,Assistant=2,Specialist=3,Docent=4,Professor=5,None=6};
Doctor();
Doctor(title a,int id,char * first,char* last,int tell,char* adres,char* email,int salar);  
};
#endif

Doctor.cpp

#include <iostream>
#include "Doctor.h"
#include "Employee.h"
using namespace std;
Doctor::Doctor() {
title tit = None ;
}
Doctor::Doctor(title a,int id,char * first,char* last,int tell,char* adres,char* email,int salar) {
title tit=a;
Employee(id,first,last, tell,adres,email,salar);
printall();
cout<<"typed";
}

主要.cpp

#include <iostream>
#include "employee.h"
#include "doctor.h"
using namespace std;
int main(){ 
Doctor a=Doctor(Doctor::None,12,"a","b",0550550505,"8424 str nu:5","@hotmail",5000);
return 0;
}

C++中的子类构造工作,因此在执行子类的构造函数主体时必须构造基类对象:

class A {
/* etc. etc. */ 
public:
void do_stuff();
};
class B : public A {
B() {
// at this point, an A has already been constructed!
A::do_stuff();
}
};

注意,在本例中,由于我们没有为A实例选择显式构造函数,因此将使用默认构造函数A::A();如果该构造函数不可用,我们会得到一个编译错误。调用了A的构造函数这一事实使我们能够使用A类的方法,就像上面例子中的A::do_stuff()一样。

但是,我们如何在B构造函数的主体之前指定不同的构造函数?或者在您的情况下,我们如何在Doctor构造函数的主体之前使用Employee的适当构造函数?

答案由@user4581301提出:您需要使用成员初始值设定项列表。此列表上的初始化/构造在正文之前执行,并且可能包括底层类。我将用一个简化的例子进行演示。假设Employee只有一个id,而Doctor只有一个附加标题。

class Employee {
protected:
int id_;
public:
Employee(int id) : id_(id) { };
int id() const { return id_; }
};
class Doctor : public Employee {
protected:
std::string title_;
public:
Doctor(int id, std::string title) : Employee(id), title_(title) { };
const std::string& title() const { return title_; }
};

因此,当构造Doctor时,它会使用它得到的id来构造它的底层Employee实例。构造函数主体用于简单成员初始化之外的更复杂的代码。


PS:

  1. 您可能希望使用std::move(title)而不仅仅是title初始化title_成员,有关详细信息,请参阅此问题
  2. 当一个构造函数有两个或三个以上具有兼容类型的参数时,这是令人困惑的——用户可能会将它们彼此混淆。您可以考虑大多数字段的默认值,并在构建后进行设置,或者使用构建器模式进行设置
  3. 地址,有两个d,而不是地址
  4. 除非您计划就地编辑char*字段,否则请使用const char *
  5. 按照您编写类的方式,Doctor方法不会对Employee方法进行写访问;确保这是你想要的
  6. 我还有一些挑剔的地方,但我现在就停下来。。。

相关内容

  • 没有找到相关文章

最新更新