【问题标题】:C++: Class IssuesC++:类问题
【发布时间】:2013-09-27 16:55:38
【问题描述】:

我正在尝试让我的班级执行以下操作...

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

  2. AddEmployee:由菜单选项 1 调用。显示“新员工”。提示用户 员工的名字、姓氏和工资率,一次一个。使用 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 下岗”,其中 index 为下岗员工的索引。

  6. DisplayEmployeeList:由菜单选项 4 调用。显示“EMPLOYEES”。然后使用 Employee.Output 显示每个员工的记录,像这样,“[1] David Johnson, 工资:5.00 美元(现任员工)”和一位前员工的记录是这样的,“[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++ 编写类。任何和所有的帮助都非常非常感谢。我已经标记了// 有问题的地方。

【问题讨论】:

  • 在 LayoffEmployee() 中,您需要一个 Employee 对象来使用它的非静态成员函数。提示使用 EmployeeSelection() 的返回值而不是丢弃它。
  • Employee.h 交给你的吗?其中有几个错误。如果不先修复这些错误,就很难完善EmployeeHandler.h
  • 不要将分号放在函数的末尾。 (在最后的}之后)

标签: c++ function class pointers void


【解决方案1】:

你的代码有很多很多问题...

我将首先提供可编译的代码,这些代码或多或少可以满足您的需求。我不知道你怎么能问问题,但将它与你自己的代码进行比较并阅读一本好的 c++ 书......

我已将您的数组替换为向量。我使用了一个构造函数来初始化 Employee。我(令我自己沮丧)添加了 std,主要是因为 Employee 应该存在于它自己的头文件中,并且在头文件中使用命名空间并不好。

在 c++ 中,operator[] 是后缀(在索引表达式之后)。

另外,在正常情况下,我会尽量保持接口和实现分开。如果不是绝对必要的话,至少我不会使用内联函数。

新代码...:

#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;
}

最后 - 代码只是编译,而不是测试。我怀疑我可能犯了一个错误,但是,唉,时间!!!

【讨论】:

  • 非常感谢,您不知道这对我有多大帮助。不过,我确实有一个问题,在几个 cin 语句中,例如 cin>>firstName cin>>lastName,我收到一个错误,指出没有运算符“>>”与这些操作数匹配?
  • 以上代码为我编译。我注意到我忘了包含字符串。
  • @Bob 作为 C++ 课程的前助教,请确保您至少了解 Werner 的变化以及希望的原因。
猜你喜欢
  • 2011-06-13
  • 2011-03-11
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 2010-12-16
  • 1970-01-01
  • 2012-04-03
相关资源
最近更新 更多