簡體   English   中英

C ++根據部分輸入使用不同的子類

[英]C++ Using different subclasses based on part of input

我在解決課堂上的一項任務時遇到了一些問題。 我解決問題的算法運行良好,但是我的問題是將數據從3個不同的文本文件讀取到2個不同的類中。

現在,第一個文本文件“ hours.txt”給出了一個字符串ID和hour int,如下所示:

adam1;170
eve2;170

因此,以“;”分隔。 下一個文件包含與以前相同的ID,名稱,滑行,類型和根據類型:如果是PH,則為工資,如果是IS,則為薪金和工資。

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

第三個文件僅包含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. 假設所有ID都是唯一的,則創建一個map<string, Employee*> Emp; 這將存儲由id索引的所有員工的信息作為鍵(“ adam1”,“ eve2”)和object作為值。

[“ adam1”] => [ph的對象]

[“ eve2”] => [is的對象]

  1. 現在,讀取file_2,其中包含有關PHIS 現在,對於每一行讀取,所有組件都將用“;”分隔。 出現在行中。 從該行中分離出組件之后,您應該能夠(使用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。 現在,對於每一行讀取,您將有兩個由“;”分隔的部分 出現在行中。 從生產線中分離出組件之后,您應該能夠(使用id )決定要設置小時數的map Emp哪個元素。 假設id為“ adam1”,小時數為170,因此現在檢查地圖是否包含[“ adam1”],如果包含, Emp[id].setHours(hours);如下所示設置小時數: Emp[id].setHours(hours);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM