C How to Program (8th Edition)
C How to Program (8th Edition)
8th Edition
ISBN: 9780133976892
Author: Paul J. Deitel, Harvey Deitel
Publisher: PEARSON
Question
Book Icon
Chapter 19, Problem 19.3E
Program Plan Intro

To implement the BasePlusCommissionEmp class using composition instead of inheritance and invoke different functions in the test program subsequently.

Expert Solution & Answer
Check Mark

Explanation of Solution

Program:

// BasePlusCommissionEmp class definition .
#ifndef BP_COMMISSION_H
#define BP_COMMISSION_H
#include<string>// C++ standard string class
usingnamespacestd;
classBasePlusCommissionEmp
{
public:
BasePlusCommissionEmp(conststring&, conststring&, conststring&,
		double = 0.0,double = 0.0, double = 0.0 );
//For generic attributes of Employee
	voidsetFirstName( conststring& ); // set first name
	stringgetFirstName() const; // return first name
	voidsetLastName( conststring& ); // set last name
	stringgetLastName() const; // return last name
	voidsetSocialSecurityNumber( conststring& ); // set SSN
	stringgetSocialSecurityNumber() const; // return SSN

// additional functions for attributes of CommisionEmployee
	voidsetGrossSales( double ); // set gross sales amount
	doublegetGrossSales() const; // return gross sales amount
	voidsetCommissionRate( double ); // set commission rate
	doublegetCommissionRate() const; // return commission rate

//additional functions for baseSalary
	voidsetBaseSalary( double ); // set base salary
	doublegetBaseSalary() const; // return base salary

// Generic functions of Employee
	doubleearnings() const;
	voidprint() const;

private:
	//Generic attributes of Employee
	stringfirstName; // composition: member object
	stringlastName; // composition: member object
	stringsocialSecurityNumber; //composition: member object
	//attributes of CommisionEmployee
	doublegrossSales; // gross weekly sales
	doublecommissionRate; // commission percentage

	//attribute for BaseSalary
	doublebaseSalary; // base salary
}; // end class BasePlusCommissionEmp
#endif

//BasePlusCommisionEmp.cpp
/* BasePlusCommissionEmp.cpp using composition Created on: 31-Jul-2018 :rajesh@acroknacks.com */
#include<string>// C++ standard string class
#include"BasePlusCommissionEmp.h"
#include<iostream>
usingnamespacestd;

BasePlusCommissionEmp::BasePlusCommissionEmp(conststring&fname, conststring&lname, conststring&ssn1,
		doublebaseSalary, doublegrossSales , doublecomRate )
:firstName (fname), lastName ( lname),socialSecurityNumber (ssn1 )
{
	setBaseSalary(baseSalary ); // validate and store base salary
	setGrossSales(grossSales);//validate and store gross sales
	setCommissionRate(comRate);//validate and store commision rate

}// end constructor

/&Functions Below  are specific to This class */
// set gross sales amount
voidBasePlusCommissionEmp::setGrossSales( double sales )
	{
	if ( sales **gt;= 0.0 )
		grossSales = sales;
	else
		throwinvalid_argument( "Gross sales must be >= 0.0" );
} // end function setGrossSales

// return gross sales amount
doubleBasePlusCommissionEmp::getGrossSales() const
{
	returngrossSales;
} // end function getGrossSales

// set commission rate
voidBasePlusCommissionEmp::setCommissionRate( double rate )
{

	if ( rate > 0.0 && rate < 1.0 )
		commissionRate = rate;
	else
		throwinvalid_argument( "Commission rate must be > 0.0 and < 1.0" );
} // end function setCommissionRate
doubleBasePlusCommissionEmp::getCommissionRate() const
{
	returncommissionRate;
} // end function getCommissionRate

voidBasePlusCommissionEmp::setBaseSalary( double salary )
{
	if ( salary >= 0.0 )
	baseSalary = salary;
	else
	throwinvalid_argument( "Salary must be >= 0.0" );
} // end function setBaseSalary
// return base salary
doubleBasePlusCommissionEmp::getBaseSalary() const
{
	returnbaseSalary;
} // end function getBaseSalary

//compute earnings
doubleBasePlusCommissionEmp::earnings() const
{
	return ( (getCommissionRate() * getGrossSales()) + getBaseSalary()) ;
} // end function earnings
// print CommissionEmployee object
voidBasePlusCommissionEmp::print() const
{
	cout<<"\nBasePlusCommission employee: ";
	cout<<lastName<<", "<<firstName<<endl;
	cout<<"SSN : "<<socialSecurityNumber<<endl;
	cout<<"\n gross sales: $ "<<getGrossSales()
	<<"\n Base Salary: $ "<<getBaseSalary()
	<<"\n commission rate: "<<getCommissionRate() ;
} // end function print

/&Generic Employee functions **/
// set first name
voidBasePlusCommissionEmp::setFirstName( conststring**first )
{
	firstName = first; // should validate
} // end function setFirstName
// return first name
stringBasePlusCommissionEmp::getFirstName() const
{
	returnfirstName;
} // end function getFirstName
// set last name
voidBasePlusCommissionEmp::setLastName( conststring&last )
{
	lastName = last; // should validate
} // end function setLastName
// return last name
stringBasePlusCommissionEmp::getLastName() const
{
	returnlastName;
} // end function getLastName
// set social security number
voidBasePlusCommissionEmp::setSocialSecurityNumber( conststring&ssn )
{
	socialSecurityNumber = ssn; // should validate
} // end function setSocialSecurityNumber
// return social security number
stringBasePlusCommissionEmp::getSocialSecurityNumber() const
{
	returnsocialSecurityNumber;
} // end function getSocialSecurityNumber

Test Program

// Testing class BasePlusCommissionEmp.
#include<iostream>
#include<iomanip>
#include"BasePlusCommissionEmp.h"// BasePlusCommissionEmp class definition
usingnamespacestd;
intmain()
{
// instantiate a BasePlusCommissionEmp object
	BasePlusCommissionEmpemployee("Sue", "Jones", "222-22-2222",1500,10000,0.16 );
	// get commission employee data
	cout<<"Employee information obtained by get functions: \n"
			<<"\nFirst name is "<<employee.getFirstName()
			<<"\nLast name is "<<employee.getLastName()
			<<"\nSocial security number is "
			<<employee.getSocialSecurityNumber()
			<<"\nBase Salary is $"<<employee.getBaseSalary()
			<<"\nGross sales is $"<<employee.getGrossSales()
			<<"\nCommission rate is $"<<employee.getCommissionRate() <<endl;

	cout<<"Earnings based on current Data : $"<<employee.earnings();
	//Modify Sales data
		employee.setGrossSales( 8000 ); // set gross sales
		employee.setCommissionRate( .1 ); // set commission rate
cout<<"\nUpdated employee information output by print function: \n"
<<endl;
employee.print(); // display the new employee information
// display the employee's earnings
cout<<"\n\n Updated Employee's earnings: $"<<employee.earnings() <<endl;
} // end main

Explanation:

Theabove program demonstrates composition as an alternate way of implementing functionality in Object oriented programming.

Composition increases duplicity of code as seen in BasePlusCommissionEmp class where a large part of attributes and functions of the Employee class have to be repeated in the BasePlusCommissionEmp class.

Also, the test code or the actual application using these objects becomes more complicated because the use of Data structures like Vectors to store all similar objects together and invoke common functionality in a single loop gets limited.

If there are a large number of objects with similar functionality and a little variances, the redundant code soon becomes prone to defect and maintenance nightmares. On the other hand, composition provides more control at the compile time by limiting common access modifier errors and method overriding errors during development time.

The has-a relationship is suited mostly where there is limited or no commonality in attributes and functionality of the objects being modelled.

It’s always better to create an is-a class hierarchy whenthe objects being modelled are having a lot of common attributes and method, resulting in a generic common subset (the base class) and other derived class specializing form it. Inheritance makes the code cleaner to write, read and maintain.

Sample Output:

Employee information obtained by get functions: 

First name is Sue
Last name is Jones
Social security number is 222-22-2222
Base Salary is $1500
Gross sales is $10000
Commission rate is $0.16
Earnings based on current Data : $3100
Updated employee information output by print function: 


BasePlusCommission employee: Jones, Sue
SSN : 222-22-2222

gross sales: $ 8000
 Base Salary: $ 1500
commission rate: 0.1

 Updated Employee's earnings: $2300

Want to see more full solutions like this?

Subscribe now to access step-by-step solutions to millions of textbook problems written by subject matter experts!
Students have asked these similar questions
(Triangle class) Design a new Triangle class that extends the abstract GeometricObject class. Draw the UML diagram for the classes Triangle and GeometricObject and then implement the Triangle class. Write a test program that prompts the user to enter three sides of the triangle, a colour, and a Boolean value to indicate whether the triangle is filled. The program should create a Triangle object with these sides and set the colour and filled properties using the input. The program should display the area, perimeter, colour, and true or false to indicate whether it is filled or not.
(Triangle class) Design a new Triangle class that extends the abstract Geometricobject class. Draw the UML diagram for the classes Triangle and Geometricobject then implement the Triangle class. Write a test program that prompts the user to enter three sides of the triangle, a color, and a Boolean value to indicate whether the triangle is filed. The program should create a Tri- angle object with the se sides, and set the color and filled properties using the input. The program should display the area, perimeter, color, and true or false to indicate whether it is filled or not.
(Package Inheritance Hierarchy) Package-delivery services, such as FedEx® ,DHL®and UPS® ,offer a number of different shipping options, each with specific costsassociated. Create an inheritance hierarchy to represent various types of packages. Useclass Package as the base class of the hierarchy, then include classes TwoDayPackageand OvernightPackage that derive from Package.Base class Package should include data members representing the name, address, city,state and ZIPcode for both these sender and the recipient of the package, in addition todata members that store the weight (in ounces)and cost per ounce to ship the package.Package’s constructor should initialize these data members. Ensure that the weight andcost per ounce contain positive values. Package should provide a public memberfunction calculate Cost that returns a double indicating the cost associated with shippingthe package. Package’s calculate Cost function should determine the cost bymultiplying the weight by the cost per…
Knowledge Booster
Background pattern image
Similar questions
SEE MORE QUESTIONS
Recommended textbooks for you
Text book image
Database System Concepts
Computer Science
ISBN:9780078022159
Author:Abraham Silberschatz Professor, Henry F. Korth, S. Sudarshan
Publisher:McGraw-Hill Education
Text book image
Starting Out with Python (4th Edition)
Computer Science
ISBN:9780134444321
Author:Tony Gaddis
Publisher:PEARSON
Text book image
Digital Fundamentals (11th Edition)
Computer Science
ISBN:9780132737968
Author:Thomas L. Floyd
Publisher:PEARSON
Text book image
C How to Program (8th Edition)
Computer Science
ISBN:9780133976892
Author:Paul J. Deitel, Harvey Deitel
Publisher:PEARSON
Text book image
Database Systems: Design, Implementation, & Manag...
Computer Science
ISBN:9781337627900
Author:Carlos Coronel, Steven Morris
Publisher:Cengage Learning
Text book image
Programmable Logic Controllers
Computer Science
ISBN:9780073373843
Author:Frank D. Petruzella
Publisher:McGraw-Hill Education