Преобразование класса в класс с использованием конструктора + наследование в C ++ - PullRequest
1 голос
/ 13 июля 2010

Здесь я могу сделать преобразование из emp объекта класса в emp объект класса. Но я не могу выполнить преобразование из employee объекта класса в emp объект класса - я добавил комментарий, где я получаю ошибку - 'setEmpID' is not a member of 'employee'. что я должен сделать, чтобы устранить эту ошибку? (Я только готовлюсь к экзамену на C ++, и это единственный вопрос, который я не смог решить).

Редактировать - см. Определение программы. В отделе начисления заработной платы есть два класса Emp и Employee.Emp, в которых содержатся сведения об идентификаторе сотрудника и его / ее платежах. Класс отдела ресурсов сотрудника isHuman, содержащий только основные сведения о зарплате и полные личные данные, такие как имя супруга, количество детей, предыдущий опыт сотрудник и т. д. Добавьте код в класс 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 ]

3 голосов
/ 13 июля 2010

В момент вызова tmp.setEmpID(10) определение класса employee еще не замечено компилятором, так как оно было просто объявлено вперед Таким образом, компилятор еще не знает методов класса.

Другими словами, это циклическая зависимость. К счастью, это легко решить, перенеся реализацию emp(employee tmp), например, на файл cpp, где видны оба определения классов.

1 голос
/ 13 июля 2010

вы не должны использовать производный класс в базовый класс, вместо этого используйте базовый класс и просто используйте базовые функции в этой функции.

Предлагаю прочитать какую-нибудь книгу по C ++, посмотрите здесь

1 голос
/ 13 июля 2010

Поскольку ваш базовый класс (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) { }
}

(примечаниев этом коде нет дополнительных назначений для сотрудника, которые есть у вашего класса - просто пример, чтобы увидеть правильный конструктор копирования для производного и базового класса)

1 голос
/ 13 июля 2010

Похоже, вам может понадобиться конструктор копирования, если вы собираетесь передавать объекты по значению. В основном конструктор, который берет объект по ссылке, чтобы сообщить компилятору, что делать в ситуации, когда объект передается по значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...