C++:抛出异常与类的引用

新建一个控制台程序,添加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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值