25/10/16 7:38
Birkhoff92
Salve, ho modificato un piccolo programma che c'era sul libro per vedere se avevo capito i concetti del polimorfismo , ereditarietà etc , solo che nel file di implementazione di BasePlusCommissionEmployee.cpp alla voce BasePlusCommissionEmployee(const string &first etc etc) 'Out of line definiton of BasePlusCommissionEmployee does not match any declaration in BasePlusCommissionEmployee...' .
Il codice è il seguente :
Employee.h
Employee.cpp
SalariedEmployee.h
SalariedEmployee.cpp
HourlyEmployee.h
HourlyEmployee.cpp
CommissionEmployee.h
CommissionEmployee.cpp
BasePlusCommissionEmployee.h
BasePlusCommissionEmployee.cpp
main.cpp
Se qualcuno mi aiutasse a capirne il motivo , grazie
Il codice è il seguente :
Employee.h
// // Employee.h // libro paga elettronico // // Created by Raffaele Sanseverino on 24/10/16. // Copyright © 2016 Raffaele Sanseverino. All rights reserved. // #ifndef Employee_h #define Employee_h #include <string> using namespace std; class Employee { public: Employee(const string &,const string &,const string &); void setFirstName(const string &); //imposta il nome string getFirstName()const;//restituisce il nome void setLastName(const string &); string getLastName() const; void setSocialSecurityNumber (const string &); //imposta il numero di pos. INPS string getSocialSecurityNumber() const; //funzione virtuale pura che rende Employee astratta virtual double earnings() const =0; virtual void print() const; private: string firstName; string lastName; string socialSecurityNumber; }; #endif /* Employee_h */
Employee.cpp
#include "Employee.h" #include <iostream> Employee::Employee(const string &first,const string &last, const string &ssn) :firstName(first), lastName(last),socialSecurityNumber(ssn) { } void Employee::setFirstName(const string &first) { firstName=first; } string Employee::getFirstName() const { return firstName; } void Employee::setLastName(const string &last) { lastName=last; } string Employee::getLastName() const { return lastName; } void Employee:: setSocialSecurityNumber(const string &ssn) { socialSecurityNumber=ssn; } string Employee::getSocialSecurityNumber() const { return socialSecurityNumber; } void Employee::print() const { cout<<getFirstName()<<' '<<getLastName() <<"\n social security number: "<<getSocialSecurityNumber(); }
SalariedEmployee.h
#ifndef SalariedEmployee_h #define SalariedEmployee_h #include "Employee.h" class SalariedEmployee:public Employee { public: SalariedEmployee(const string &, const string &,const string &, double=0.0); void setWeeklySalary(double); double getWeeklySalary() const; virtual double earnings() const; virtual void print() const; private: double weeklySalary; }; #endif /* SalariedEmployee_h */
SalariedEmployee.cpp
#include <iostream> using namespace std; #include "SalariedEmployee.h" SalariedEmployee::SalariedEmployee(const string &first, const string &last, const string &ssn, double salary) :Employee(first,last,ssn) { setWeeklySalary(salary); } //imposta il fisso settimanale void SalariedEmployee::setWeeklySalary(double salary) { weeklySalary= (salary <0.0) ? 0.0:salary; } double SalariedEmployee::getWeeklySalary() const { return weeklySalary; } //calcola la retribuzione double SalariedEmployee::earnings() const { return getWeeklySalary(); } //visualizza le informazioni del dipendente void SalariedEmployee::print() const { cout<<" salaried employee: "; Employee::print(); cout<<"\n weekly salary: "<<getWeeklySalary(); }
HourlyEmployee.h
#ifndef HourlyEmployee_h #define HourlyEmployee_h #include "Employee.h" class HourlyEmployee:public Employee { public: HourlyEmployee(const string &, const string &, const string &,double=0.0,double=0.0); void setWage(double); double getWage() const; void setHours(double); double getHours() const; virtual double earnings() const; virtual void print() const; private: double wage; double hours; }; #endif /* HourlyEmployee_h */
HourlyEmployee.cpp
#include <iostream> using namespace std; #include "HourlyEmployee.h" HourlyEmployee::HourlyEmployee(const string &first, const string &last, const string &ssn, double hourlyWage, double hoursWorked) : Employee(first,last,ssn) { setWage(hourlyWage); setHours(hoursWorked); } void HourlyEmployee::setWage(double hourlyWage) { wage = (hourlyWage <0.0 ?0.0: hourlyWage); } double HourlyEmployee::getWage() const { return wage; } void HourlyEmployee::setHours(double hoursWorked) { hours=(((hoursWorked >= 0.0 ) && (hoursWorked <= 168.0 )) ? hoursWorked:0.0); } double HourlyEmployee::getHours() const { return hours; } double HourlyEmployee::earnings() const { if (getHours() <= 40) //nessuno straordinario ( devono essere almeno 41 ore) return getWage() * getHours(); else return 40* getWage() + ((getHours() -40 ) * getWage()*1.5); } void HourlyEmployee::print() const { cout<<" hourly employe : "; Employee::print(); cout<<"\n hourly wage : "<<getWage()<< "; hours worked : "<<getHours(); }
CommissionEmployee.h
#ifndef CommissionEmployee_h #define CommissionEmployee_h #include "Employee.h" class CommissionEmployee:public Employee { public: CommissionEmployee(const string &, const string &, const string &, double =0.0,double=0.0); void setCommissionRate(double); double getCommissionRate() const; void setGrossSales(double); double getGrossSales() const; virtual double earnings() const; virtual void print() const; private: double grossSales; double commissionRate; }; #endif /* CommissionEmployee_h */
CommissionEmployee.cpp
#include <iostream> using namespace std; #include "CommissionEmployee.h" CommissionEmployee::CommissionEmployee(const string &first, const string &last, const string &ssn,double sales, double rate) :Employee(first,last,ssn) { setGrossSales(sales); setCommissionRate(rate); } void CommissionEmployee::setCommissionRate(<#double#>rate) { commissionRate=((rate >0.0 && rate <1.0) ? rate: 0.0); } double CommissionEmployee::getCommissionRate() const { return commissionRate; } void CommissionEmployee::setGrossSales(double sales) { grossSales=((sales <0.0)?0.0:sales); } double CommissionEmployee::getGrossSales() const { return grossSales; } double CommissionEmployee::earnings() const { return getCommissionRate() * getGrossSales(); } void CommissionEmployee::print() const { cout<<"commission employee :"; Employee::print(); cout<<"\n gross sales: "<<getGrossSales() <<" ; commission rate: "<<getCommissionRate(); }
BasePlusCommissionEmployee.h
#ifndef BasePlusCommissionEmployee_h #define BasePlusCommissionEmployee_h #include "CommissionEmployee.h" class BasePlusCommissionEmployee: public CommissionEmployee { public: BasePlusCommissionEmployee(const string &, const string &, const string &, double=0.0,double=0.0); void setBaseSalary(double); double getBaseSalary() const; virtual double earnings() const; virtual void print() const; private: double baseSalary; }; #endif /* BasePlusCommissionEmployee_h */
BasePlusCommissionEmployee.cpp
#include <iostream> using namespace std; #include "BasePlusCommissionEmployee.h" BasePlusCommissionEmployee::BasePlusCommissionEmployee(const string &first, const string &last, const string &ssn,double sales, double rate,double salary) :CommissionEmployee(first,last,ssn,sales,rate) { setBaseSalary(salary); } void BasePlusCommissionEmployee::setBaseSalary(double salary) { baseSalary=((salary <0.0)?0.0:salary); } double BasePlusCommissionEmployee::getBaseSalary() const { return baseSalary; } double BasePlusCommissionEmployee::earnings() const { return getBaseSalary()+ CommissionEmployee::earnings(); } void BasePlusCommissionEmployee::print() const { cout<<"base salaried : "; CommissionEmployee::print(); cout<<"; base salary: "<<getBaseSalary(); }
main.cpp
#include <iostream> using namespace std; #include <iomanip> using std:: setprecision; #include <vector> using std::vector; #include "Employee.h" #include "SalariedEmployee.h" #include "HourlyEmployee.h" #include "CommissionEmployee.h" #include "BasePlusCommissionEmployee.h" void virtualViaPointer(const Employee * const); void virtualViaReference(const Employee &); int main(int argc, const char * argv[]) { //imposto il valore per formato con virgola cout<<fixed<<setprecision(2); //creo oggetti delle classi derivate SalariedEmployee salariedEmployee( "Raffaele", "Sanseverino","111-12-1212",800 ); HourlyEmployee hourlyEmployee( "Mario","Esposito", "222-22-2234",16.75,40); CommissionEmployee commissionEmployee ( "Sue","Jones","333-33-3335",1000.06); BasePlusCommissionEmployee basePlusCommissionEmployee( "Pietro","Volente","444-44-4547",5000.04,300); cout<<"Employees processed individually using static binding:\n\n"; salariedEmployee.print(); cout<<"\nearned € "<<salariedEmployee.earnings()<<"\n\n"; hourlyEmployee.print(); cout<<"\nearned "<<hourlyEmployee.earnings()<<"\n\n"; commissionEmployee.print(); cout<<"\nearned "<<commissionEmployee.earnings()<<"\n\n"; basePlusCommissionEmployee.print(); cout<<"\nearned "<<basePlusCommissionEmployee.earnings()<<"\n\n"; vector <Employee * > employees(4); employees[0]=&salariedEmployee; employees[1]=&hourlyEmployee; employees[2]=&commissionEmployee; employees[3]=&basePlusCommissionEmployee; cout<<"Employees processed polymophically via dynamic binding :\n\n"; cout<<" Virtual function calls made off base-class pointers:\n\n"; for(size_t i=0;i<employees.size();i++) virtualViaPointer(employees[i]); cout<<"Virtual function calls made off base-class reference:\n\n"; for(size_t i=0;i<employees.size();i++) virtualViaReference(*employees[i]); return 0; } void virtualViaPointer(const Employee * const baseClassPtr) { baseClassPtr->print(); cout<<"\earned € "<<baseClassPtr->earnings()<<"\n\n"; } void virtualViaReference(const Employee &baseClassRef) { baseClassRef.print(); cout<<"\nearned € "<<baseClassRef.earnings()<<"\n\n"; }
Se qualcuno mi aiutasse a capirne il motivo , grazie
aaa