C ++基于输入的一部分使用不同的子类

时间:2016-05-23 22:47:54

标签: c++ class inheritance ifstream

我在课堂上解决任务时遇到了一些问题。我解决问题的算法工作正常,但我的问题是将3个不同文本文件中的数据读入2个不同的类。

现在第一个文本文件“hours.txt”给出了一个字符串id和小时int,如下所示:

adam1;170
eve2;170

所以,用“;”分隔。 下一个文件包含与之前相同的ID和名称,出租车,类型,并根据类型:工资如果PH,或工资和ovtwage如果是。

adam1;Adam Driver;12345678;PH;5;
eve2;Eve Assistant;23456789;IS;650;10

第3个文件只包含int 160,它被定义为generalWorkingHours。现在我的问题出现了。我有从1个文件读取数据到1个类的经验,但在这种情况下,我必须将数据读取到2个类,ph,并且取决于id的类型(adam1和eve2)。我已经提供了两个这样的课程:

#ifndef IS_H
#define IS_H
#include "Employee.h"
#include <iostream>

using namespace std;

class is: public Employee
{
    public:
        is();
        virtual ~is();
        void setSalary(int salary);
        int getSalary();
        void setOvtWage(int ovtWage);
        int getOvtWage();
    protected:
    private:
        int salary;
        int ovtWage;
};

#endif // IS_H

#ifndef PH_H
#define PH_H
#include "Employee.h"
#include <iostream>

using namespace std;

class ph: public Employee
{
    public:
        ph();
        virtual ~ph();
        void setWage(int wage);
        int getWage();
    protected:
    private:
        int wage;
};

#endif // PH_H

这两个类都包含公共“员工”

#ifndef EMPLOYEE_H
#define EMPLOYEE_H

#include <iostream>

using namespace std;

class Employee
{
    public:
        Employee();
        virtual ~Employee();
        void setId(string id);
        string getId();
        void setName(string name);
        string getName();
        void setTaxId(string taxid);
        string getTaxId();
        void setType(string type);
        string getType();
        void setHours(int hours);
        int getHours();
    protected:
    private:
        string id;
        string name;
        string taxid;
        string type;
        int hours;
};

#endif // EMPLOYEE_H

现在,通常我会创建一个函数来读取一个文件,一个像这样解析每一行:

void Resolver::parseTextLine(string tmp, int & carCnt, carList X[]){
    std::size_t found;

    found=tmp.find(";");
    if (found!=string::npos) {
        X[carCnt].point=tmp.substr(0,found);
        tmp=tmp.substr(found+1);
    }

    found=tmp.find(";");
    if (found!=string::npos) {
        X[carCnt].license=tmp.substr(0,found);
        tmp=tmp.substr(found+1);
    }

    found=tmp.find(";");
    if (found!=string::npos) {
        X[carCnt].time=atoi(tmp.substr(0,found).c_str());
        tmp=tmp.substr(found+1);
    }

    carCnt++;
}


void Resolver::readDataFromFiles(string carFile, int & carCnt, carList X[]){

    carCnt=0;

    ifstream finS(carFile.c_str(),ios::in);

    bool first=true;
    while (!finS.eof()) {
        string tmp="";
        getline(finS,tmp);
        if (tmp!="") {
            if (first) {
                first=!first;
            } else {
                parseTextLine(tmp,carCnt,X);
            }
        }
    }

    finS.close();
}

注意:这只是我如何解决它的想法,但我没有使用多个文件和类的经验。所有功能都是预制的,我只需要以某种方式将它们拼凑在一起。

1 个答案:

答案 0 :(得分:0)

  1. 假设所有ID都是唯一的,请创建map<string, Employee*> Emp;这将存储id为索引的所有员工的信息(&#34; adam1&#34;,&#34; eve2&#34;)和作为价值的对象。
  2. [&#34; adam1&#34;] =&gt; [ph的对象]

    [&#34; eve2&#34;] =&gt; [对象是]

    1. 现在,请阅读包含PHIS信息的file_2。现在,对于每一行读取,您将所有组件分隔为&#34;;&#34;出现在线上。在从行中分离组件之后,您应该能够(使用type)决定应该实例化哪个派生类。

      if(type == PH)
      {
          //suppose id = "adam"
          ph *pEmployeePH = new ph(); 
          //also set wage 
          //insert [id] in map Emp if not already present
      }
      if(type == IS) 
      {
          //suppose id is now "eve2"
          is *pEmployeeIS = new is();
          //also set salary and ovtwage
          //insert [id] in map Emp if not already present
      }
      
    2. 准备好map后,立即阅读file_1。现在,对于每一行读取,您将有两个分量由&#34;;&#34;出现在线上。从行中分离组件后,您应该能够(使用id)决定应该访问/修改map Emp的哪个元素以设置小时数。 假设id是&#34; adam1&#34;和小时= 170,所以现在检查地图是否包含[&#34; adam1&#34;],如果确实包含,则按如下方式设置小时数:Emp[id].setHours(hours);