繁体   English   中英

在C ++中使用构造函数+继承进行类到类的转换

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM