2016-05-23 6 views
0

Ich habe einige Probleme beim Lösen einer Aufgabe aus der Klasse. Mein Algorithmus zur Lösung der Probleme funktioniert gut, aber mein Problem ist das Lesen von Daten aus 3 verschiedenen Textdateien in 2 verschiedene Klassen.C++ Mit verschiedenen Unterklassen basierend auf Teil der Eingabe

Nun ist die erste Textdatei "hours.txt" gibt einen String-ID und Stunde int, etwa so:

adam1;170 
eve2;170 

so von einem ";" getrennt. Die nächste Datei enthält die gleiche ID wie zuvor und Name, Taxid, Typ und je nach Typ: Lohn wenn PH, oder Gehalt und Ovtwage wenn IS.

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

Die 3. Datei enthält nur das int 160, das als generalWorkingHours definiert ist. Jetzt, wo meine Probleme entstehen. Ich habe Erfahrung im Lesen von Daten aus 1 Datei in 1 Klasse, aber in diesem Fall muss ich Daten zu 2 Klassen, ph lesen und hängt von der Art der IDs ab (adam1 und eve2). Ich habe zwei Klassen wie folgt zur Verfügung gestellt:

#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 

und

#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 

Beide Klassen, die Öffentlichkeit „Mitarbeiter“ enthalten

#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 

Nun, normalerweise würde ich eine Funktion erstellen, um lese eine Datei und analysiere jede Zeile wie folgt:

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(); 
} 

HINWEIS: Dies ist nur eine Idee, wie ich versuche, es zu lösen, aber ich habe keine Erfahrung mit mehreren Dateien und Klassen. Alle Funktionen sind vorgefertigt und ich muss sie nur irgendwie zusammenfügen.

+0

Könnten Sie zeigen uns die Klasse Employee bitte?Es sieht so aus, als hättest du uns die ph-Klasse zweimal gegeben. –

+0

Oh..Im sorry, es sollte jetzt behoben werden. – Jonaswg

+1

Was genau ist dein Problem? Was ist los mit dem 'if (id == id1) employee = new ist; sonst Mitarbeiter = neuer ph; '? –

Antwort

0
  1. Unter der Annahme, alle IDs sind einzigartig, erstellen map<string, Employee*> Emp; Diese Information aller Mitarbeiter von ID als Schlüssel („adam1“, „eve2“) indiziert gespeichert werden und Objekt als Wert.

[ "adam1"] => [Objekt von ph]

[ "eve2"] => [Aufgabe ist]

  1. Nun, lese file_2, das Informationen über PH und IS enthält. Jetzt werden für jede gelesene Zeile alle Komponenten durch ";" in der Zeile erscheinen. Nachdem Sie die Komponenten von der Linie getrennt haben, sollten Sie entscheiden können, welche abgeleitete Klasse instanziiert werden soll (mit 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. Sobald Sie Ihre map bereit haben, jetzt lesen DATEI_1. Jetzt für jede gelesene Zeile haben Sie 2 Komponenten getrennt durch ";" in der Zeile erscheinen. Nachdem Sie die Komponenten von der Linie getrennt haben, sollten Sie in der Lage sein, (id) zu entscheiden, welches Element von map Emp Sie aufrufen/ändern sollten, um die Stunden einzustellen. Angenommen id „adam1“ und Stunden = 170, so dass nun prüfen, ob Karte enthält [ „adam1“] und wenn enthält dann die Stunden wie folgt festgelegt: Emp[id].setHours(hours);