[英]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();
}
注意:這只是我要解決的想法,但是我沒有使用多個文件和類的經驗。 所有功能都是預制的,我只需要以某種方式將其修補即可。
map<string, Employee*> Emp;
這將存儲由id索引的所有員工的信息作為鍵(“ adam1”,“ eve2”)和object作為值。 [“ adam1”] => [ph的對象]
[“ eve2”] => [is的對象]
現在,讀取file_2,其中包含有關PH
和IS
。 現在,對於每一行讀取,所有組件都將用“;”分隔。 出現在行中。 從該行中分離出組件之后,您應該能夠(使用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 }
准備好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.