hi everyone...
i know the code below has many other problems with it but it's in 'develope-"mental" stage' (if you know what i mean)..
it's going to be a list database employee payroll system when it grows up..
presently though, i have a wierd problem...
my overloaded friend function ostream for <<.
I am getting 'protected data' error C2248, when i try to compile.
However, a human friend of mine has run it fine on their machine sans errors. I am stumped. I have rebuilt, cleaned and even
openeed a new project ...
can anyone take a look and tell me if they see something?
thanks Michele
ps any comments on anything else will also be appreciated and
considered constructive...this is a big project for me, and I am still pretty much a newbie-green.
thanks again
Code:
//
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
using std::ostream;
using std::istream;
#include<list>
using std::list;
#include<iomanip>
using namespace std;
#include <fstream>
using std::ifstream;
using std::ofstream;
#include <string>
struct Name
{
char first[20];
char last[20];
};
struct EmployeeData
{
char type[20];
Name name;
char ssn[12];
double rate;
double commission;
};
// Abstract base class definition
//
class employee // Declare a virtual base
// class named employee
{
public:
// Constructors for employee class
employee();
employee(EmployeeData data);
// Declare pure virtual functions
virtual void print() = 0;
virtual double pay() = 0;
//Friend Function definitions / overloaded stream operators
friend ostream & operator << ( ostream & output, const employee *n_employee );
protected:
EmployeeData data;
}; // End of the employee class definition
// default constructor
// required for multiple inheritance of virtual base class
employee::employee()
{
strcpy(data.name.first, "");
strcpy(data.name.last, "");
strcpy(data.type, "");
strcpy(data.ssn, "000-00-0000");
data.rate = 0;
data.commission = 0;
}
//employee constructor
employee::employee(EmployeeData E_Data)
{
strcpy(data.name.first, E_Data.name.first);
strcpy(data.name.last, E_Data.name.last);
strcpy(data.type, E_Data.type);
strcpy(data.ssn, E_Data.ssn);
data.rate = E_Data.rate;
data.commission = E_Data.commission;
}
//___________________________________________________
class hourly:virtual public employee
{
public:
hourly(){}//needed for Salaried to be a base class
hourly (EmployeeData E_Data, double hours);
// pay function for the Engineer class
virtual double pay();
// print function for the Engineer class
virtual void print();
private:
double hours;
};
//hourly constructor
hourly::hourly(EmployeeData E_Data, double hrs)
{
strcpy(data.name.first, E_Data.name.first);
strcpy(data.name.last, E_Data.name.last);
strcpy(data.type, E_Data.type);
strcpy(data.ssn, E_Data.ssn);
data.rate = E_Data.rate;
data.commission = E_Data.commission;
hours = hrs;
}
// Definition of the pay function for the hourly class
//
double hourly::pay()
{
if (hours <=40)
return ((data.rate) * (hours)) ;
else
return ((data.rate) * (40))+((data.rate*1.5) * (hours-40));
}
// Definition of the print function for the hourly class
//
void hourly::print()
{
cout << "Employee name : " << data.name.first << " , " << data.name.last << endl;
cout << "Employee Type :" << data.type << endl;
cout << "Social Security Number : "<< data.ssn <<endl;
cout << setprecision(2);
cout << setiosflags(ios::fixed | ios::showpoint);
cout << "Pay is : $" << pay()
<< " dollars this month." << endl;
cout << endl;
}
//end hourly member functions
//____________________________________________________
class salary:virtual public employee
{
public:
salary(){}//needed for Salaried to be a base class
salary (EmployeeData E_Data, double sal);
// pay function for the Engineer class
virtual double pay();
// print function for the Engineer class
virtual void print();
private:
double annual_sal;
};
//salary constructor
salary::salary(EmployeeData E_Data, double sal)
{
strcpy(data.name.first, E_Data.name.first);
strcpy(data.name.last, E_Data.name.last);
strcpy(data.type, E_Data.type);
strcpy(data.ssn, E_Data.ssn);
data.rate = 0;
data.commission = 0;
annual_sal = sal;
}
// Definition of the pay function for the hourly class
//
double salary::pay()
{
return annual_sal / 12 ;
}
// Definition of the print function for the hourly class
//
void salary::print()
{
cout << "Employee name : " << data.name.first << " , " << data.name.last << endl;
cout << "Employee Type :" << data.type << endl;
cout << "Social Security Number : "<< data.ssn <<endl;
cout << setprecision(2);
cout << setiosflags(ios::fixed | ios::showpoint);
cout << "Pay is : $" << pay()
<< " dollars this month." << endl;
cout << endl;
}
//end hourly member functions
//____________________________________________________
class Employee_Database
{
void showEmployeeMenu();
void getMenuSelection();
public:
Employee_Database( const char* employee);
~Employee_Database();
void Run();
private:
void Hire();
void Fire();
void Retire();
};
Employee_Database::Employee_Database( const char* employee)
{
}
void Employee_Database::Hire()
{
}
void Employee_Database::Fire()
{
}
void Employee_Database::Retire()
{
}
//Friend Function definitions / overloaded stream operators
ostream &operator << ( ostream & output, const employee *n_employee )
{
cout << left << setw(12) << n_employee->data.name.first
<< setw(12) << n_employee->data.name.last;
return output;
}//Fx
//utility function
//void enterData( EmployeeData &newWorker);
void main()
{
//testcase
EmployeeData newWorker;
strcpy(newWorker.name.first, "John");
strcpy(newWorker.name.last, "Doe");
strcpy(newWorker.type, "SecurityGuard");
strcpy(newWorker.ssn, "111-11-1111");
newWorker.rate = 30.0;
newWorker.commission = 0;
EmployeeData newWorker2;
strcpy(newWorker2.name.first, "Jane");
strcpy(newWorker2.name.last, "Doe");
strcpy(newWorker2.type, "Engineer");
strcpy(newWorker2.ssn, "222-22-2222");
newWorker.rate = 0;
newWorker.commission = 0;
hourly SecurityGuard( newWorker, 46 );
SecurityGuard.print();
salary Engineer( newWorker2, 40000 );
Engineer.print();
}//main
/*
void enterData( EmployeeData &newWorker)
{
cout << "\nOpening File.\n\n";
ifstream infile("PRO_IN.txt");
if(!infile){
cerr << "inFile could not be opened." << endl;
exit(1);
}
typedef list <string> Em_list;
Em_List edata;
while( infile )
{
if (infile)
edata.insert(test.end(), &newWorker);
} //end while
} // end function
*/
Smilies disabled in post by Salem