0

我正试图让我的班级做以下事情......

  1. EmployeeHandler: 将 m_employeeCount 初始化为零。

  2. AddEmployee:由菜单选项 1 调用。显示“NEW EMPLOYEE”。提示用户输入员工的名字、姓氏和工资率,一次一个。使用 Employee.Setup 将员工添加到 m_lstEmployee。显示“已添加员工 m_employeeCount”。增加 m_employeeCount。

  3. EmployeeSelection:按索引显示员工列表;提示用户输入员工索引并返回索引。

  4. EditEmployee:由菜单选项 2 调用。使用 EmployeeSelection 获取要编辑的员工的索引。验证索引是否有效,如果无效则显示错误消息。使用 Employee.Output 显示所选员工的当前信息。提示用户输入员工的新名字、姓氏和工资率,一次一个。使用 Employee.Setup 更改 m_lstEmployee 中的员工信息。显示“** Employee index updated”,其中 index 是用户选择的索引。

  5. LayoffEmployee:由菜单选项 3 调用。使用 EmployeeSelection 获取要裁员的员工的索引。使用 Employee.Output 显示所选员工的名字、姓氏和工资率。使用 Employee.LayOff 解雇员工。显示“下岗员工索引”,其中 index 为下岗员工的索引。

  6. DisplayEmployeeList:由菜单选项 4 调用。显示“EMPLOYEES”。然后使用 Employee.Output 显示每个员工记录,“[1] David Johnson, PAY: $5.00 (CURRENT EMPLOYEE)”和一个前员工记录,“[2] David Johnson, PAY: $5.00 (FORMER) EMPLOYEE)",其中括号中的数字是员工在 m_lstEmployee 中的索引。

  7. GetEmployee:返回 m_lstEmployee 中所选员工记录的地址。

  8. GetEmployeeCount:返回 m_employeeCount 中的员工人数。

到目前为止,我已经...

#ifndef _EMPLOYEEHANDLER
#define _EMPLOYEEHANDLER

#include "Employee.h"

class EmployeeHandler
{
    public:
    EmployeeHandler()
    {
        m_employeeCount = 0; //undefined?
    };

    void AddEmployee()
        {
            string firstName;
            string lastName;
            float payRate;

            cout<<"NEW EMPLOYEE"<<endl;
            cout<<"First Name:"<<endl;
            cin>>firstName;
            cout<<"Last Name:"<<endl;
            cin>>lastName;
            cout<<"Pay Rate:"<<endl;
            cin>>payRate;
            Employee.Setup(firstName,lastName,payRate); //Problem here
            cout<<"**Employee m_employeeCount added"<<endl;
            m_employeeCount+=1; //m_employeeCount undefined?
        }

    void EditEmployee()
        {
            int indexEdit;
            string newFirst;
            string newLast;
            float newPay;
            cout<<"Which employee would you like to edit"<<endl;
            cin>>indexEdit;
            EmployeeSelection(indexEdit); //undefined?
            Employee.Output(); //
            cout<<"Employee new first name:"<<endl;
            cin>>newFirst;
            cout<<"Employee new last name:"<<endl;
            cin>>newLast;
            cout<<"Employee new pay rate:"<<endl;
            cin>>newPay;
            Employee.Setup(newFirst,newLast,newPay); ///
            cout<<"** Employee index updated"<<endl;
        }


    void LayoffEmployee()
        {
            EmployeeSelection();
            Employee.Output(EmployeeSelection); //Problems here
            Employee.LayOff(EmployeeSelection);
            cout<<"Employee laid off"<<endl;
        }
    void DisplayEmployeeList()
        {
            cout<<"EMPLOYEES"<<endl;
            for (int i=0; i<50; i++)
                cout<<[i]<<Employee.Output(m_1stEmployee)<<endl; //
        }

    int EmployeeSelection()
        {
            int indexNumber;
            for (int i= 0; i <50; i++)
                cout<<[i]m_1stEmployee<<endl; //
            cout<<"Which Employee Index would you like to select?"<<endl;

            cin>>indexNumber;
            for (int i = 0; i <50; i++)
                if ([i]=indexNumber) //
                    return [i]
        }


    Employee& GetEmployee( int index )
        {if (index=;                             // completely confused here
    }
    int GetEmployeeCount()
        {
            return m_employeeCount;
        };

    private:
    Employee m_lstEmployee[50];
    int m_employeeCount;
};

#endif

employee.h 文件如下...

#ifndef _EMPLOYEE
#define _EMPLOYEE
#include<iostream>
#include<iomanip>
#include <string>
using namespace std;

class Employee
{
    public:
    void Setup( const string& first, const string& last, float pay );
    {
        m_firstName = first;
        m_lastName = last;
        m_payPerHour = pay;
        m_activeEmployee = true;
    }

    string GetName()
    {
        return m_firstName+""+m_lastName
    };

    bool GetIsActive()
    {
        return m_activeEmployee;
    };

    void LayOff()
    {
        m_activeEmployee= false;
    };
    void Output()
        cout<<GetName()<<",PAY:$"<<fixed<<setprecision(2)<<m_payPerHour<<endl;

    private:
    string m_firstName;
    string m_lastName;
    float m_payPerHour;
    bool m_activeEmployee;
};

#endif

在过去的两天里,我一直在写这门课,试图找出我做错了什么。这是我第一次尝试用 C++ 编写类。任何和所有的帮助都非常非常感谢。我已经标记了我遇到问题的地方//

4

1 回答 1

2

Your code has many, many problems...

I'll start by providing compilable code that more or less does what you want. I'm not sure how you can go about asking questions, but compare it to your own code and read a good c++ book...

I've replaced your array with a vector. I've used a constructor to initialize Employee. I've (to my own dismay) added std, mainly because Employee shall live in its own header and it's not good to use a namespace in a header.

In c++ the operator[] is postfix (after the indexed expression).

Also, under normal circumstances I'll try and keep interface and implementation seperate where possible. At the least I would not use inline functions if not absolutely necessary.

The new code...:

#include <iostream>
#include <iomanip>
#include <vector>
#include <iterator>
#include <string>

class Employee
{
    public:
      //This is a constructor....
      Employee( const std::string& first, const std::string& last, float pay )
      //The members can be initialized in a constructor initializer list as below.
      : m_firstName( first ), m_lastName( last ), m_payPerHour( pay ),
        m_activeEmployee() //Scalars are initialized to zero - bool to false...
      {
      }

      std::string GetName() const
      {
        return m_firstName+" "+m_lastName;
      }

      bool GetIsActive() const
      {
        return m_activeEmployee;
      };

      void LayOff()
      {
        m_activeEmployee = false;
      }

      std::ostream& Output( std::ostream& out ) const
      {
        return out << GetName() <<",PAY:$" 
                   << std::fixed << std::setprecision(2) << m_payPerHour;
      }

    private:
      std::string m_firstName;
      std::string m_lastName;
      float m_payPerHour;
      bool m_activeEmployee;
};

inline std::ostream& operator << ( std::ostream& os, const Employee& employee )
{
  return( employee.Output( os ) );
}


class EmployeeHandler
{
  public:
    void AddEmployee()
    {
      std::string firstName;
      std::string lastName;
      float payRate;

      std::cout<<"NEW EMPLOYEE"<<std::endl;
      std::cout<<"First Name:"<<std::endl;
      std::cin>>firstName;
      std::cout<<"Last Name:"<<std::endl;
      std::cin>>lastName;
      std::cout<<"Pay Rate:"<<std::endl;
      std::cin>>payRate;
      employees_.push_back( Employee( firstName,lastName,payRate ) );
      std::cout<<"**Employee m_employeeCount added"<<std::endl;
    }

    void EditEmployee()
    {
      std::string newFirst;
      std::string newLast;
      float newPay;
      std::cout<<"Which employee would you like to edit"<<std::endl;
      int indexEdit = GetSelection();
      Employee& employee = employees_[indexEdit];
      std::cout << employee << std::endl;
      std::cout<<"Employee new first name:"<<std::endl;
      std::cin>>newFirst;
      std::cout<<"Employee new last name:"<<std::endl;
      std::cin>>newLast;
      std::cout<<"Employee new pay rate:"<<std::endl;
      std::cin>>newPay;
      employee = Employee( newFirst, newLast, newPay );
      std::cout<<"** Employee index updated"<<std::endl;
    }

    void LayoffEmployee()
    {
      int index = GetSelection();
      if( employees_[index].GetIsActive() )
      {
        std::cout << "Laying off employee:\n" << employees_[index] << std::endl;
        employees_[index].LayOff();
      }
      else
      {
        std::cerr << "Already layed off employee:" << employees_[index] << std::endl;
      }
    }

    void DisplayEmployeeList()
    {
      std::copy( employees_.begin(), employees_.end(), std::ostream_iterator<Employee>( std::cout, "\n" ) );
    }

    int GetSelection()
    {
        std::size_t indexNumber;
        std::cout << "Select an employee from the list below by specifying its number:" << std::endl;
        DisplayEmployeeList();

        do{
          while( !std::cin >> indexNumber )
          {
            std::cin.clear(); 
            std::cin.ignore();
            std::cerr << "Select a number..." << std::endl;
          }
          if( indexNumber >= employees_.size() )
          {
            std::cerr << "Select a number within range of list below:" << std::endl;
            DisplayEmployeeList();
          }
        }
        while( indexNumber >= employees_.size() );
        return indexNumber;
    }

    Employee& operator[]( std::size_t index )
    {
      return employees_[index];
    }

    const Employee& operator[]( std::size_t index ) const
    {
      return employees_[index];
    }

    std::size_t EmployeeCount() const
    {
      return employees_.size();
    }

  private:
    std::vector<Employee> employees_;
};


int main( int argc, char* argv[] )
{
  return 0;
}

Finally - the code is merely compiled, not tested. I suspect I might have made a mistake, but alas, time!!!

于 2013-09-27T17:48:14.147 回答