[英]Class to class conversion using constructor+inheritance in C++
在这里,我可以进行从emp
类对象到emp
类对象的转换。 但是我无法从employee
类对象转换为emp
类对象-我在出现错误的地方添加了注释'setEmpID' is not a member of 'employee'
。 我该怎么办才能解决此错误? (我只是在准备C ++考试,这是我无法解决的唯一问题)。
编辑 -看到这是程序的定义-工资和工资两类定义了Emp和Employee。Emp在工资部门中定义,其中包含有关雇员ID的详细信息及其付款的详细信息。 雇员是人力资源部门类,仅包含基本工资详细信息和完整的个人详细信息,例如配偶姓名,子女数量,雇员的过往经历等。在Emp类中添加代码,以便可以从一种类型的雇员对象转换为另一种雇员对象。 转换时,不在源类中的项(例如,当源类为Employee时的子代数)应采用默认值。
#include<iostream.h>
#include<conio.h>
#include<string.h>
class employee;
class emp
{
private:
unsigned int empID;
public:
emp(){
empID=0;
}
emp(unsigned int x){
empID=x;
}
emp(employee tmp) {
// i am getting error here.
tmp.setEmpID(10);
}
void setEmpID(unsigned int x){
empID=x;
}
int getEmpID(){
return empID;
}
};
class employee : public emp {
private:
char name[30];
public:
employee();
employee(unsigned int x);
employee(unsigned int x,char y[]);
employee(emp tmp);
void display();
};
employee :: employee()
{
emp();
name[0]='\0';
}
employee :: employee(unsigned int x)
{
emp(x);
name[0]='\0';
}
employee :: employee(unsigned int x,char y[]) : emp(x)
{
strcpy(name,y);
}
employee :: employee(emp tmp) : emp( tmp.getEmpID() )
{
name[0]='\0';
}
void employee :: display(){
cout<<"No is -> "<<getEmpID()<<endl<<"Name -> "<<name;
}
void main() {
clrscr();
emp e1(10);
employee e2(10u,"nimita");
cout<<e1.getEmpID()<<endl;
e2.display();
getch();
}
在调用tmp.setEmpID(10)
,编译器尚未看到employee
类的定义,因为它只是向前声明的。 因此,编译器尚不了解该类的方法。
换句话说,这是一个周期性依赖性。 幸运的是,通过将emp(employee tmp)
的实现移动到cpp文件(其中两个类定义均可见emp(employee tmp)
,很容易解决。
如果要按值传递对象,则似乎需要复制构造函数。 基本上是一个构造函数,该构造函数通过引用获取对象,以告诉编译器在按值传递对象的情况下该怎么做。
由于您的基类(emp)具有派生类的构造函数,因此我想说您的设计存在缺陷。 基类永远不需要知道派生类中的内容,这与您在此处发布的代码相同,因此无需传递派生类来构造基类。
您真正需要做的是为基类创建一个真正的副本构造函数(我建议使用初始化程序),然后在派生副本构造函数中将派生类实例传递给它,即:
class emp
{
private:
unsigned int empID;
public:
emp(): empID(0) { }
emp(unsigned int x): empID(x) { }
emp(emp const& tmp): empID(tmp.empID) { }
virtual ~emp() { }
}
class employee: public emp
{
public:
employee(): emp() { }
employee(unsigned int x): emp(x) { }
employee(employee const& tmp): emp(tmp) { }
}
(请注意,此代码没有为您的类提供额外的员工分配,只是一个示例,用于查看派生类和基类的正确副本构造函数)
您不必使用派生类到基类中,而是使用基类而只使用该函数中的基函数。
我建议看一些C ++书,看这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.