簡體   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