将类对象传递到模板化类私有成员范围 我是C++新手,想学点东西。也许这是不可能的。但我想: 创建一个记录所有员工及其信息的Employee类(请参见下面的“我的代码”) 然后我想为链表创建一个模板类。在这个类的私有范围内,我将有一个“T data”类型。
将类对象传递到模板化类私有成员范围 我是C++新手,想学点东西。也许这是不可能的。但我想:将类对象传递到模板化类私有成员范围 我是C++新手,想学点东西。也许这是不可能的。但我想: 创建一个记录所有员工及其信息的Employee类(请参见下面的“我的代码”) 然后我想为链表创建一个模板类。在这个类的私有范围内,我将有一个“T data”类型。,c++,C++,将类对象传递到模板化类私有成员范围 我是C++新手,想学点东西。也许这是不可能的。但我想: 创建一个记录所有员工及其信息的Employee类(请参见下面的“我的代码”) 然后我想为链表创建一个模板类。在这个类的私有范围内,我将有一个“T data”类型。我希望每次在main中创建LinkedList对象时,我的构造函数都实例化一个“Employee”。我希望这是有道理的。我的代码按照我现在设置的方式工作。然而,我并不一定要按照我想要的方式来模板化它 模板 类雇员{//Parent 私人: 国
- 创建一个记录所有员工及其信息的Employee类(请参见下面的“我的代码”)
- 然后我想为链表创建一个模板类。在这个类的私有范围内,我将有一个“T data”类型。我希望每次在main中创建LinkedList对象时,我的构造函数都实例化一个“Employee”。我希望这是有道理的。我的代码按照我现在设置的方式工作。然而,我并不一定要按照我想要的方式来模板化它
模板
类雇员{//Parent
私人:
国际雇员ID;
双倍工资;
整小时;
双倍工资率;
std::字符串Employeename;
公众:
雇员(int-ID,双Prate,std::string-EName){
EmployeeID=ID;
工资率=普拉特;
Employeename=EName;
Hours=0;//我们的构造函数只能给每个员工0小时。
薪水=0.00;
}
雇员(){
EmployeeID=0;
工资率=0.0;
Employeename=“不适用”;
小时=0;
薪水=0.00;
}
作废setPaycheck(){
然而,我不一定按照我想要的方式来模板化它-你是什么意思?我不明白你的问题。模板
不是一个类
——它本身不是一种类型。模板类
是一种使类
成为一种类型的代码。员工
是一个类——一种类型。当你键入员工
时,你正在使用它它好像员工
是一个模板。它不是一个模板。还有语法错误;员工
--为什么是复数?它包含一个员工的信息,而不是多个员工的信息。您的继承也没有意义:类LinkedList:Employees
LinkedList
不是员工
,它有Employee
。最后,为什么LinkedList
是一个模板?T
应该是生成实际链接列表的type函数的一个参数;您不使用它。您的意思是LinkedList
?@yakadamnevraumont现在Employees
是一个类模板:-)它显然是一个编辑churill修复的错误。gazeb0:
您创建的是通过连接的类。这在某些情况下非常方便,但链表通常与类型无关,并且不关心列表中的类型。我建议不要将Employee
作为模板,直到您发现需要它并使您的链表能够正常工作h任何类型,不仅仅是员工
。哇,我真不敢相信我这么快就得到了回复。@Ted Lyngnmo。非常感谢大家。是的,这是我的错别字。Ted,你比我解释得更好,本质上,我想把我的“LinkedList's EmployeeObject”变成“t数据”,这意味着它可以接受数据类型,而sti我将执行链接等所需的操作。但是,当我创建一个试图将“T data”设置为Employees对象的构造函数时,我收到一个错误,上面写着“Field has complete type'T'”。我不确定我到底做错了什么。谢谢大家的回复。
template <class T>
class Employees { //Parent
private:
int EmployeeID;
double Paycheck;
int Hours;
double Payrate;
std::string Employeename;
public:
Employees(int ID, double Prate, std::string EName) {
EmployeeID = ID;
Payrate = Prate;
Employeename = EName;
Hours = 0; //our constructor can just give each Employee 0 hours.
Paycheck = 0.00;
}
Employees() {
EmployeeID = 0;
Payrate = 0.0;
Employeename = "N/A";
Hours = 0;
Paycheck = 0.00;
}
void setPaycheck() {
std::cout << std::fixed;
std::cout << std::setprecision(2);
double i = Payrate;
i = i * 100;
i = i * Hours;
i = i / 100;
Paycheck = i;
//so I'm not sure why I couldn't just cast the double, but the complier kept rounding down each time.
// I had to make a conversion of my decimal into a whole number and then go back and divide it to get the
// paycheck amount.
};
void setEMPname(std::string Name) {
Employeename = Name;
}
void setPayrate(double payrate) {
Payrate = payrate;
}
void setEMPid(int IDnum) {
EmployeeID = IDnum;
}
void setHOURS(int hours) {
Hours += hours;
}
int IDReturn() { return EmployeeID; }
int HoursReturn() { return Hours; }
double PaycheckReturn() { return Paycheck; }
double PayrateReturn() { return Payrate; }
std::string NameReturn() { return Employeename; }
};
template <class T>
class LinkedLists :Employees<T> { //child
friend class Employees<T>;
private:
////I want change the object below to "T data"
Employees<T> EmployeeObject; //contains all the employee information
LinkedLists<T>* nextlink;
LinkedLists<T>* prevlink;
public:
LinkedLists() {
EmployeeObject;
nextlink = nullptr;
prevlink = nullptr;
}
void setname(std::string Name) {
EmployeeObject.setEMPname(Name);
}
void setPrate(double payrate) {
EmployeeObject.setPayrate(payrate);
}
void setid(int IDnum) {
EmployeeObject.setEMPid(IDnum);
}
void setPayCheck() { EmployeeObject.setPaycheck(); }
LinkedLists<T>*& setLinkforward() {
return nextlink;
}
LinkedLists<T>*& setLinkbackward() {
return prevlink;
}
int idReturn() { return EmployeeObject.IDReturn(); }
double payrateReturn() { return EmployeeObject.PayrateReturn(); }
std::string nameReturn() { return EmployeeObject.NameReturn(); }
void AddHours(int Hours) { EmployeeObject.setHOURS(Hours); }
int ReturnHours() { return EmployeeObject.HoursReturn(); }
double ReturnPayCheck() {
return EmployeeObject.PaycheckReturn();
}
};