Строка неоднозначна - PullRequest
0 голосов
/ 12 июля 2020

Разработать простое приложение для расчета заработной платы для компании; В системе есть три типа сотрудников:

  • наемный работник,
  • почасовой работник,
  • и наемный работник.

Подробная информация об этих сотрудниках приведена ниже:

  • Наемные сотрудники: имя, налоговая ставка, зарплата, название набора, название набора, получение имени, расчет зарплаты, конструктор, деструктор
  • почасовые сотрудники : имя, налоговая ставка, часы, почасовая ставка, получить имя, рассчитать зарплату, конструктор, деструктор
  • Уполномоченный сотрудник: имя, налоговая ставка, продажи, ставка комиссии, получить имя, рассчитать зарплату, конструктор, деструктор

Вам необходимо выполнить следующие задачи:

  1. Нарисовать объектно-ориентированную модель системы с использованием иерархии классов.
  2. Реализовать соответствующий конструктор и деструктор.
  3. Написать вниз соответствующие функции установки / получения. Включите класс String в иерархию классов для работы с именем сотрудника.
  4. Реализуйте другие функции-члены, описанные выше.
  5. Система должна принимать входные данные как массив, содержащий объекты сотрудников, полиморфно рассчитывает зарплату ( в соответствии с объектом сотрудника) и генерирует отчет.
  6. Демонстрация (5) с использованием основной функции.
    #include<iostream>
    #include<string.h>
    using namespace std;
    class string
    {
        char* s;
    public:
        string()
        {
    
        }
        string(const char* a)
        {
            if (a != NULL)
            {
                a = new char[strlen(a) + 1];
                strcpy(a, a);
            }
            else
                a = NULL;
        }
        void setstring(const char* a)
        {
            if (a != NULL)
            {
                delete[] a;
                a = NULL;
            }
            if (a != NULL)
            {
                a = new char[strlen(a) + 1];
                strcpy(s, a);
            }
        }
        const char* getString() const
        {
            return s;
        }
        string& operator = (const char* p)
        {
            delete[] s;
            if (p != NULL)
            {
                s = new char[strlen(p) + 1];
                strcpy(s, p);
            }
            else
                s = NULL;
            return *this;
        }
        friend ostream& operator << (ostream& os, const string& a)
        {
            os << a.s;
            return os;
        }
        ~string()
        {
            s = NULL;
            delete[] s;
        }
    };
    class Employee
    {
    private:
        string firstname;
        string lastname;
        string number;
    public:
        Employee()
        {
    
        }
        Employee(string first, string last, string n)
        {
            firstname = first;
            lastname = last;
            number = n;
        }
        void setfirstname(string first)
        {
            firstname = first;
        }
        string getfirstname()
        {
            return firstname;
        }
        void setlastname(string last)
        {
            lastname = last;
        }
        string getlastname()
        {
            return lastname;
        }
        void setnumber(string n)
        {
            number = n;
        }
        string getnumber()
        {
            return number;
        }
        virtual double earnings()=0;
    };
    class salariedemployee :public Employee
    {
    private:
        double weeklysalary;
    public:
        salariedemployee()
        {
    
        }
        salariedemployee(string first, string last, string n, float salary):Employee(first, last, n)
        {
            this->weeklysalary = salary;
             setweeklysalary(salary);
        }
        void setweeklysalary(double salary)
        {
            if (salary >= 0.0)
            {
                weeklysalary = salary;
            }
            else
                cout << "Weekly salary must be greater than or equal to 0.0"<<endl;
        }
        double getweeklysalary()
        {
            return weeklysalary;
        }
        double earnings()
        {
            return getweeklysalary();
        }
    };
    class hourlyemployee :public Employee
    {
    private:
        double wage;
        double hours;
    public:
        hourlyemployee()
        {
    
        }
        hourlyemployee(string first, string last, string n, double hourlywage, double hoursworked) :Employee(first, last, n)
        {
            setwage(hourlywage);
            sethours(hoursworked);
        }
        void setwage(double hourlywage)
        {
            if (hourlywage >= 0.0)
            {
                wage = hourlywage;
            }
            else
                cout << "Hourly wage must be greater than or equal to 0.0"<<endl;
        }
        double getwage()
        {
            return wage;
        }
        void sethours(double hoursworked)
        {
            if ((hoursworked >= 0.0) && (hoursworked <= 168.0))
            {
                hours = hoursworked;
            }
            else
                cout << "Hours must be greater than or equal to 0.0 and less than or equal to 168.0"<<endl;
        }
        double gethours()
        {
            return hours;
        }
        double earnings()
        {
            if (gethours() <= 40)   //no overtime
            {
                return getwage() * gethours();
            }
            else
                return 40 * getwage() + (gethours() - 40) * getwage() * 1.5;
        }
    };
    class commisionedemployee :public Employee
    {
    private:
        double grossSales;
        double commisionedrate;
    public:
        commisionedemployee()
        {
    
        }
        commisionedemployee(string first, string last, string n, double sales, double rates) :Employee(first, last, n)
        {
            setgrossSales(sales);
            setcommisionedrate(rates);
        }
        void setgrossSales(double sales)
        {
            if (sales >= 0.0)
            {
                grossSales = sales;
            }
            else
                cout << "Gross sales must be greater than or equal to 0.0"<<endl;
        }
        double getgrossSales()
        {
            return grossSales;
        }
        void setcommisionedrate(double rates)
        {
            if (rates > 0.0 && rates < 1.0)
            {
                commisionedrate = rates;
            }
            else
                cout << "Comminsioned rate must be greater than 0.0 and less than 1.0"<<endl;
        }
        double getcommisionedrate()
        {
            return commisionedrate;
        }
        double earnings()
        {
            return getcommisionedrate() * getgrossSales();
        }
    };
    int main()
    {
        /*salariedemployee SE("John", "Smith", "111", 80009);
        hourlyemployee HE("Kashif", "Gulzar", "5555", 4.2, 7.7);
        commisionedemployee CE("Sajid", "Bhatti", "444", 2.3, 3.3);
        cout << "Employee processed individually as:";
        cout <<"Salaried employee earned" << SE.earnings()<<endl;
        cout << "Hourly employee earned" << HE.earnings()<<endl;
        cout << "Commisioned employee earned" << CE.earnings() << endl;*/
    
        Employee* employees[3];
        employees[0] = new salariedemployee("John", "Smith", "111", 80009);
        employees[1] = new hourlyemployee("Kashif", "Gulzar", "5555", 4.2, 7.7);
        employees[2] = new commisionedemployee("Sajid", "Bhatti", "444", 2.3, 3.3);
        for (int i = 0; i < 3; i++)
        {
            cout << "Name:" << employees[i]->getfirstname() << "  " << employees[i]->getlastname() << endl;
            cout << "Salary:" << employees[i]->earnings() << endl;
        }
        system("pause");
        return 0;
    }

Это дает мне ошибку, что строка неоднозначна. как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

Проблема:

class Employee{
// code...
        double earnings()
        {
            // returning nothing! problem   
        }
}

earnings() метод переопределяется во всех производных классах. Это сильный намек на то, что метод базового класса Employee::earnings() должен быть виртуальным. Более того, было бы лучше, если бы вы сделали его Pure Virtual . Зачем? Поскольку вы ничего не знаете о Employee::earnings(), вы не знаете, какие доходы он должен вернуть. Если у вас нет такой информации, вы не можете точно определить эту функцию или вернуть из нее значение. Следовательно, вы делаете его чисто виртуальным. Чистая виртуальная функция должна быть переопределена каждым производным классом, производным от Employee.

Как сделать ее чистой виртуальной? Просто измените приведенное выше на:

   virtual double earnings() = 0;

Затем в производных классах вы можете добавить ключевое слово override, чтобы явно указать, что вы переопределяете эту функцию:

class salariedemployee :public Employee
{
//code...
    double earnings() override
    {
        //function definition code...
    }
}

Обратите внимание, что класс, который имеет чистую виртуальную функцию, является абстрактным классом. Объекты такого класса не могут быть сделаны:

Employee e; //error
Employee* e; //good
Employee* salaried = new salariedemployee("John", "Smith", "111", 80009); // good
2 голосов
/ 12 июля 2020

Голова вашего метода (внутри класса Employee)

double earnings()

обещает, что тело вернет значение типа double.

Тело вашего метода

{}

не делает этого, потому что в нем нет строки с return, например, return 1.0;. Это то, что вам сообщает компилятор.

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

Поскольку вы объявляете

Employee* employees[3]; /* pointer to base class */

и вызываете как

employees[i]->earnings()

, вы на самом деле звоните реализация пустого базового класса. Вероятно, вы не собираетесь и не считаете, что следует вызывать переопределения в производных классах. Однако для этого потребуется объявить метод в базовом классе virtual.

Так что, возможно, ваша проблема будет решена, если вы сделаете

virtual double earnings()
{ /* any not purely abstract implementation ending in something like ... */
  return myDoubleVariable;
}

внутри базового класса.

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