C How To Program Plus Mylab Programming With Pearson Etext -- Access Card Package (8th Edition)
C How To Program Plus Mylab Programming With Pearson Etext -- Access Card Package (8th Edition)
8th Edition
ISBN: 9780134227023
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
can someone help me with this problem in C++ In this exercise, you will work with 3 classes: Shape, Triangle and Rectangle. The first class is the class Shape. The Shape class has two float type properties: center_x and center_y. The Shape class also has the following methods: a constructor Shape(), that will set center_x and center_y to zero. set/get functions for the two attributes 1) You need to implement two additional functions for Shape: setCenter(float x, float y), that will set the new center and print: Figure moved to [<center_x>, <center_y>] draw(), that will print: Drawing Figure at [<center_x>, <center_y>] 2) You will have to implement another class, called Triangle, which inherits from the Shape class. The Triangle class has one int attribute: side. The Triangle class has the following methods: a constructor that will receive one int parameters (side) set/get for its attribute setCenter(float x, float y), that will set the new center and…
Experiment with two classes that have a straightforward derivation relationship. Insert println statements into the constructors of both the parent and child classes. In the child, do not explicitly call the function Object() { [native code] } of the parent. So, what happens? Why? Change the child's function Object() { [native code] } to explicitly call the parent's function Object() { [native code] }. What happens next?
What are the three things you need to do when working with classes that include pointer variables as member variables?
Knowledge Booster
Background pattern image
Similar questions
SEE MORE QUESTIONS
Recommended textbooks for you
Text book image
C++ Programming: From Problem Analysis to Program...
Computer Science
ISBN:9781337102087
Author:D. S. Malik
Publisher:Cengage Learning