新建一个控制台程序,添加2个新类:Employee与Database
头文件 stdafx.h:
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
using namespace std;
Employee.h 中的代码:
#pragma once
#include <string>
using std::string;
namespace Records
{
const int kDefaultStartingSalary = 30000;
class Employee
{
public:
Employee(void);
~Employee(void);
void Promote(int raiseAmount = 1000);
void Demote(int demeritAmount = 1000);
void Hire();
void Fire();
void Display() const;
string GetFirstName() const;
void SetFirstName(string firstName);
string GetLastName() const;
void SetLastName(string lastName);
int GetEmployeeNumber() const;
void SetEmployeeNumber(int num);
int GetSalary() const;
void SetSalary(int newSalary);
bool IsHired() const;
protected:
string _firstName;
string _lastName;
int _employeeNumber;
int _salary;
bool _isHired;
};
}
Employee.cpp 中的代码:
#include "StdAfx.h"
#include "Employee.h"
namespace Records
{
Employee::Employee(void)
: _firstName(""),
_lastName(""),
_employeeNumber(0),
_salary(kDefaultStartingSalary),
_isHired(false)
{
}
Employee::~Employee(void)
{
}
void Employee::Promote(int raiseAmount)
{
SetSalary(GetSalary() + raiseAmount);
}
void Employee::Demote(int demeritAmount)
{
SetSalary(GetSalary() - demeritAmount);
}
void Employee::Hire()
{
_isHired = true;
}
void Employee::Fire()
{
_isHired = false;
}
void Employee::Display() const
{
cout << "Employee: " << GetLastName() << ", " << GetFirstName() << endl;
cout << "-------------------------------------" << endl;
cout << (_isHired ? "Current Employee" : "Former Employee") << endl;
cout << "Employee Number: " << GetEmployeeNumber() << endl;
cout << "Salary: $" << GetSalary() << endl;
cout << endl;
}
string Employee::GetFirstName() const
{
return _firstName;
}
void Employee::SetFirstName(string firstName)
{
_firstName = firstName;
}
string Employee::GetLastName() const
{
return _lastName;
}
void Employee::SetLastName(string lastName)
{
_lastName = lastName;
}
int Employee::GetEmployeeNumber() const
{
return _employeeNumber;
}
void Employee::SetEmployeeNumber(int num)
{
_employeeNumber = num;
}
int Employee::GetSalary() const
{
return _salary;
}
void Employee::SetSalary(int newSalary)
{
_salary = newSalary;
}
bool Employee::IsHired() const
{
return _isHired;
}
}
Database.h的中代码:
#pragma once
#include <vector>
#include "Employee.h"
namespace Records
{
const int kFirstEmployeeNumber = 1000;
class Database
{
public:
Database(void);
~Database(void);
Employee& AddEmployee(string firstName, string lastName);
Employee& GetEmployee(int employeeNumber);
Employee& GetEmployee(string firstName, string lastName);
void DisplayAll() const;
void DisplayCurrent() const;
void DisplayFormer() const;
protected:
vector<Employee> vecEmployee;
int _nextEmployeeNumber;
};
}
Database.cpp中的代码:
#include "StdAfx.h"
#include "Database.h"
namespace Records
{
Database::Database(void)
{
_nextEmployeeNumber = kFirstEmployeeNumber;
}
Database::~Database(void)
{
}
Employee& Database::AddEmployee(string firstName, string lastName)
{
Employee emp;
emp.SetFirstName(firstName);
emp.SetLastName(lastName);
emp.SetEmployeeNumber(_nextEmployeeNumber++);
emp.Hire();
vecEmployee.push_back(emp);
return vecEmployee[vecEmployee.size() - 1];
}
Employee& Database::GetEmployee(int employeeNumber)
{
for (auto it = vecEmployee.begin(); it != vecEmployee.end(); ++it)
{
if (it->GetEmployeeNumber() == employeeNumber)
{
return *it;
}
}
cerr << "No employee with number " << employeeNumber << endl;
throw exception();
}
Employee& Database::GetEmployee(string firstName, string lastName)
{
for (auto it = vecEmployee.begin(); it != vecEmployee.end(); ++it)
{
if (it->GetFirstName() == firstName && it->GetLastName() == lastName)
{
return *it;
}
}
cerr << "No employee with number " << firstName << ", " << lastName << endl;
throw exception();
}
void Database::DisplayAll() const
{
for (auto it = vecEmployee.begin(); it != vecEmployee.end(); ++it)
{
it->Display();
}
}
void Database::DisplayCurrent() const
{
for (auto it = vecEmployee.begin(); it != vecEmployee.end(); ++it)
{
if (it->IsHired())
{
it->Display();
}
}
}
void Database::DisplayFormer() const
{
for (auto it = vecEmployee.begin(); it != vecEmployee.end(); ++it)
{
if (!it->IsHired())
{
it->Display();
}
}
}
}
主文件代码:
#include "stdafx.h"
#include <stdexcept>
//#include "Employee.h"
#include "Database.h"
using namespace Records;
double DivideNumber(double d1, double d2)
{
if (d2 == 0)
{
throw std::exception();
}
return d1 / d2;
}
void Func(const int n)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
try
{
cout << DivideNumber(2.5, 0) << endl;
}
catch (const std::exception& e)
{
cout << "An exception was caught\t" << e.what() << endl;
}
cout << "Testing the Employee class." << endl;
Employee emp;
emp.Hire();
emp.SetFirstName("Marni");
emp.SetLastName("Kleper");
emp.SetEmployeeNumber(71);
emp.SetSalary(50000);
emp.Promote();
emp.Promote(50);
emp.Display();
Database db;
Employee& emp1 = db.AddEmployee("Greg", "Wallis");
emp1.Fire();
Employee& emp2 = db.AddEmployee("Scott", "Kleper");
emp2.SetSalary(100000);
Employee& emp3 = db.AddEmployee("Nick", "Solter");
emp3.SetSalary(18888);
emp3.Promote();
cout << "***********************************" << endl;
cout << "All employees: " << endl;
cout << "***********************************" << endl;
db.DisplayAll();
cout << "***********************************" << endl;
cout << "Current employees: " << endl;
cout << "***********************************" << endl;
db.DisplayCurrent();
cout << "***********************************" << endl;
cout << "Former employees: " << endl;
cout << "***********************************" << endl;
db.DisplayFormer();
return 0;
}