代码之家  ›  专栏  ›  技术社区  ›  sagarkothari

使用C++中的构造函数+继承实现类到类的转换

  •  1
  • sagarkothari  · 技术社区  · 14 年前

    在这里我可以做转换 emp 类对象到 电磁脉冲 类对象。但我不能从 employee 类对象到 电磁脉冲 类对象-我添加了错误的注释- 'setEmpID' is not a member of 'employee' . 我应该如何解决此错误?(我正在为C++考试做准备,这是我唯一不能解决的问题。)

    编辑 -参见这是程序的定义-有两个类EMP和EMPLOYEE。EMP在工资单部门中定义,包含有关员工ID的详细信息和他/她的付款的详细信息。Employee Ishuman Resource Department类,仅包含基本工资详细信息和完整的个人详细信息,如配偶姓名、子女人数、以前在 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();
    }
    
    4 回复  |  直到 7 年前
        1
  •  3
  •   Péter Török    14 年前

    在呼叫点 tmp.setEmpID(10) ,类的定义 employee 编译器尚未看到,因为它刚刚被向前声明。所以编译器还不知道类的方法。

    换句话说,这是一种周期性依赖。幸运的是,通过移动 emp(employee tmp) 例如cpp文件,其中两个类定义都可见。

        2
  •  1
  •   Jordan    14 年前

    如果要按值传入对象,可能需要一个复制构造函数。基本上是一个构造函数,它引用一个对象,告诉编译器在对象通过值传递的情况下应该做什么。

        3
  •  1
  •   Community CDub    7 年前

    您不必将派生类用于基类,而只需使用该函数中的基类。

    我建议读一些C++书籍,看看 here

        4
  •  1
  •   MarkD    14 年前

    因为您的基类(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) { }
    }
    

    (注意,此代码没有类所具有的对员工的额外分配-只是一个示例,用于查看派生类和基类的正确复制构造函数)