在这里,我可以从emp
类对象转换为emp
类对象。但是我无法从employee
类对象转换为emp
类对象 - 我添加了注释,我收到了错误 - 'setEmpID' is not a member of 'employee'
。我该怎么做才能解决这个错误? (我只是在准备C ++考试,这是我唯一无法解决的问题。)
编辑 - 看这是程序的定义 - 在工资单部门中定义了两个类Emp和Employee.Emp,其中包含有关员工ID的详细信息以及有关他/她付款的详细信息。员工是人力资源部门课程,仅包含基本工资详情和完整的个人详细信息,如配偶姓名,子女人数,以前的经历 employee等在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();
}
答案 0 :(得分:3)
在调用tmp.setEmpID(10)
时,编译器尚未看到类employee
的定义,因为它只是向前声明。所以编译器还不知道类的方法。
换句话说,这是一个周期性的依赖。幸运的是,通过将emp(employee tmp)
的实施方式移至例如,可以很容易地解决问题。 cpp文件,其中两个类定义都可见。
答案 1 :(得分:1)
如果要按值传递对象,看起来可能需要复制构造函数。基本上是一个构造函数,它通过引用获取对象,告诉编译器在按值传递对象时要执行的操作。
答案 2 :(得分:1)
由于您的基类(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) { }
}
(请注意,此代码没有为您的类具有的员工额外分配 - 只是一个示例,可以查看派生类和基类的正确复制构造函数)
答案 3 :(得分:1)
您不必将派生类用于基类,而是使用基类并仅使用该函数中的基本函数。
我建议你阅读一些C ++书籍,看看here