Oppure

Loading
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.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 :):hail:
aaa
25/10/16 7:40
Birkhoff92
mi da anche quest altro errore :/
aaa
25/10/16 8:20
nessuno
Hai confrontato bene queste due parti

BasePlusCommissionEmployee(const string &, const string &, const string &, double=0.0,double=0.0)

BasePlusCommissionEmployee::BasePlusCommissionEmployee(const string &first, const string &last, const string &ssn,double sales, double rate,double salary)

come ha fatto il compilatore?
Ultima modifica effettuata da nessuno 25/10/16 8:22
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
25/10/16 8:25
Birkhoff92
ci manca un double=0.0 ? :/ sul libro non lo portava per questo
aaa
25/10/16 8:30
nessuno
Quale libro? Sicuro?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
25/10/16 14:12
Birkhoff92
Deitel & Deitel Fondamenti di programmazione c++. Ho provato a mettere pure il terzo double ma niente
Ultima modifica effettuata da Birkhoff92 25/10/16 14:13
aaa
25/10/16 14:13
nessuno
Quale pagina?

"Niente" cosa vuol dire? Hai lo stesso errore? E qual è adesso il codice?
Ultima modifica effettuata da nessuno 25/10/16 14:14
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
25/10/16 14:46
Birkhoff92
pagina 706 figura 13.19. Si stesso identico errore
aaa