[C/C++] Zwei private Vektoren miteinander vergleichen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Characticl D, 16. Juni 2010 .

  1. 16. Juni 2010
    Zwei private Vektoren miteinander vergleichen

    Hallo zusammen,

    bräuchte mal eure Hilfe.
    Mein Code sieht wie folgt aus:

    Spoiler
    main.cpp
    Code:
    // Standardheader
    #include <iostream>
    #include <cstdlib>
    #include <conio.h>
    #include <vector>
    #include <string>
    #include <fstream>
    
    // Eigene Header
    #include "Auftrag.hpp"
    #include "Auftragsliste.hpp"
    
    using namespace std;
    
    int main()
    {
     Auftragsliste *vorher = new Auftragsliste("vorher.txt");
     Auftragsliste *nachher = new Auftragsliste("nachher.txt");
     
     
     cout << endl << "Zum Beenden Taste druecken..." << endl;
     getch();
     return 0;
    }
    
    Auftrag.hpp
    Code:
    #ifndef AUFTRAG_HPP
    #define AUFTRAG_HPP
    
    #include <string>
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    class Auftrag
    {
     private:
     int filialnummer;
     int auftragsnummer;
     string auftragsdatum;
     string name;
     string vorname;
     string geburtsdatum;
     string strasse;
    
     public:
     Auftrag(string s);
     ~Auftrag();
     int readLine(string s);
     int ausgabe();
    
    };
    
    #endif
    
    Auftrag.cpp
    Code:
    #include "Auftrag.hpp"
    
    using namespace std;
    
    Auftrag::Auftrag(string s)
    {
     readLine(s);
     ausgabe();
    }
    
    Auftrag::readLine(string s)
    {
     char *p = (char *)s.c_str(); 
    
     char *pInhalt;
     int i = 0;
     bool isInData = false;
     
     while(*p != '\0')
     {
     if('\"' == *p)
     {
     
     if(isInData)
     {
     // Man befindet sich zwischen zwei Hochkommata
     char *buffer = new char[p - pInhalt + 1];
     memcpy (buffer, pInhalt, p - pInhalt);
     buffer[p - pInhalt] = '\0';
    
    
     switch(i)
     {
     case 0:
     filialnummer = atoi(buffer);
     break;
     case 1:
     auftragsnummer = atoi(buffer);
     break;
     case 2:
     auftragsdatum = buffer;
     break;
     case 3:
     name = buffer;
     break;
     case 4:
     vorname = buffer;
     break; 
     case 5:
     geburtsdatum = buffer;
     break;
     case 6:
     strasse = buffer;
     break;
     }
     delete [] buffer;
    
     i++;
     }
     else
     { 
     // Man befindet sich außerhalb der zwei Hochkommata
     pInhalt = p+1;
     }
     
     
     isInData = !isInData;
     }
     p++;
     }
    
    
     return 0;
    }
    
    
    Auftrag::~Auftrag()
    {
     
    }
    
    
    Auftragsliste.hpp
    Code:
    #ifndef AUFTRAGSLISTE_HPP
    #define AUFTRAGSLISTE_HPP
    
    #include <string>
    #include <vector>
    #include <iostream>
    #include <fstream>
    
    #include "Auftrag.hpp"
    
    class Auftragsliste
    {
     private:
     vector<Auftrag*> auftraege;
    
     public:
     Auftragsliste(string filename);
     ~Auftragsliste();
     
     int readFile(string filename);
     static int compareLists(Auftragsliste *vorher, Auftragsliste *nachher);
    };
    
    #endif
    
    Auftragsliste.cpp
    Code:
    #include "Auftragsliste.hpp"
    
    using namespace std;
    
    Auftragsliste::Auftragsliste(string filename)
    {
     readFile(filename);
    }
    
    Auftragsliste::readFile(string filename)
    {
     ifstream file(filename.c_str()); 
     string line;
     int zeile = 1;
    
     // Aufträge in vector 'auftraege' einlesen
     while( getline( file, line ) )
     { 
     auftraege.push_back(new Auftrag(line));
     zeile++;
     }
    
     cout << zeile << endl;
     return 0; 
    }
    
    Auftragsliste::compareLists(Auftragsliste *vorher, Auftragsliste *nachher)
    {
     
     
    
     return 0;
    }
    
    Auftragsliste::~Auftragsliste()
    { 
     int i;
     
     // Vector löschen
     for(i = auftraege.size() -1; i >= 0; i--)
     {
     delete auftraege[i];
     auftraege.erase(auftraege.begin() + i);
     }
     
     // Funktioniert nicht
     //while (auftraege.size()) 
     //delete pop_back();
     }
    
    

    Ich erstelle also zwei Listen (Vektoren) in der Klasse Auftragsliste, private.
    Jeder Vektor steht für eine Datei, die so aussieht vom Format:

    Code:
    "Filialnummer" "Auftragsnummer" "Auftragsdatum" "Nachname" "Vorname" "Geburtsdatum" "Strasse"
    Jede Zeile ist also quasi ein "Auftrag", sprich ein Auftrags-Klassenobjekt.
    Die Zeilen sind dann je ein ein Element des Vektors.

    Ich muss nun beide Vektoren miteinander vergleichen, also schauen, ob Sachen vom einen Vektor im anderen Vektor sind.

    Ich habe ja schon in der Auftragslistenklasse eine Funtkion "compareLists" erstellt, der ich dann am liebsten einfach die beiden Listen übergeben würde. Nur haut das nicht so hin, weil beide ja private sind und auch bleiben sollen.

    Wie kann ich das am besten lösen?
    Beide Vektoren erstmal sortieren? Wie kann ich sie vergleichen, am besten die einzelnen Elemente eines Auftrags?

    Danke für die Hilfe.
    Bin noch nicht so bewandert :/
     
  2. 16. Juni 2010
    AW: Zwei private Vektoren miteinander vergleichen

    Wie wärs, wenn du der Auftragsliste eine Methode hinzufügst, mit der du den vektor zurückgibst und die dann vergleichst.

    Auftragsliste.hpp
    Code:
    #ifndef AUFTRAGSLISTE_HPP
    #define AUFTRAGSLISTE_HPP
    
    #include <string>
    #include <vector>
    #include <iostream>
    #include <fstream>
    
    #include "Auftrag.hpp"
    
    class Auftragsliste
    {
     private:
     vector<Auftrag*> auftraege;
    
     public:
     Auftragsliste(string filename);
     ~Auftragsliste();
     
     int readFile(string filename);
     static int compareLists(vector<Auftrag*> *vorher, vector<Auftrag*> *nachher);
     vector<Auftrag*>* getAuftraege();
    };
    
    #endif
    Auftragsliste.cpp
    Code:
    [...]
    Auftragsliste::getAuftraege() {
     return &this->auftraege;
    }
    
    Auftragsliste::compareLists(vector<Auftrag*> *vorher, vector<Auftrag*> *nachher)
    {
     //for Schleife um zu schauen ob jedes Objekt des ersten Vektors in dem anderen Vektor ist 
    
     return 0;
    }[...]
    Der Aufruf in der main.cpp
    Code:
    // Standardheader
    #include <iostream>
    #include <cstdlib>
    #include <conio.h>
    #include <vector>
    #include <string>
    #include <fstream>
    
    // Eigene Header
    #include "Auftrag.hpp"
    #include "Auftragsliste.hpp"
    
    using namespace std;
    
    int main()
    {
     Auftragsliste *vorher = new Auftragsliste("vorher.txt");
     Auftragsliste *nachher = new Auftragsliste("nachher.txt");
     
     cout << Auftragsliste::compareLists(vorher->getAuftraege(), nachher->getAuftraege()) << endl; 
    
     cout << endl << "Zum Beenden Taste druecken..." << endl;
     getch();
     return 0;
    }
    Ich hoffe du verstehst, was ich meine.

    greez
     
  3. 16. Juni 2010
    AW: Zwei private Vektoren miteinander vergleichen

    Also wirklich verstehen, was du da gecodet hast tu ich nicht

    Das sind schonmal die Fehlermeldungen:

    Code:
    auftragsliste.cpp(28): error C2040: 'Auftragsliste::getAuftraege': 'int (void)' unterscheidet sich von 'std::vector<_Ty> *(void)' in Bezug auf die Anzahl vorgenommener Dereferenzierungen
     with
     [
     _Ty=Auftrag *
     ]
    auftragsliste.cpp(28): error C2556: 'int Auftragsliste::getAuftraege(void)': Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'std::vector<_Ty> *Auftragsliste::getAuftraege(void)'
     with
     [
     _Ty=Auftrag *
     ]
    
    
    Gibts da keine einfachere Methode, wie ich einfach die zwei Listen übergeben kann und die dann vergleiche. Das scheint so brutal kompliziert
     
  4. 16. Juni 2010
    AW: Zwei private Vektoren miteinander vergleichen

    Ich hab es nicht ausprobiert, habs nur so hingescripted.

    Hier noch eine Information zum prüfen ob zwei Vektoren identisch sind:
    Ich weiß zwar nicht, ob dir das hilft, da ich auch nicht weiß, wieso der Rückgabewert der compare Funktion int ist, aber damit kannste die Vektoren vergleichen.

    Eine andere Idee wäre, wenn du eine Methode für die Auftragsliste schreibst, die toArray oder so heißt und einfach alle Aufträge in einem Array zurückgibt. Dann kannst du beide Arrays einfach miteinander vergleichen wenn dir das hilft.

    greez
     
  5. 16. Juni 2010
    AW: Zwei private Vektoren miteinander vergleichen

    Ist es nicht möglich, dass ich eine Funktion wie diese in der Auftragslistenklasse mache:

    Code:
    int compare(Auftragsliste *vorher, Auftragsliste *nachher)
    
    Und so dann in der main-Funktion beide Listen übergebe?
    In der Funktion selbst wird dann was gemacht wie:

    Code:
    if(vorher->auftraege[1] != nachher->auftraege[1])
     cout << "Elemente ungleich..." << endl;
    
    Genau so funktionierts ja nicht, weil ich ja nicht zwei private Elemente miteinander vergleichen kann...
     
  6. 16. Juni 2010
    AW: Zwei private Vektoren miteinander vergleichen

    Hoi

    Erstell doch eine Getter-Funktion oder deklarier das Teil als protected, dann hast du das Problem mit dem Zugriff ja schonmal gelöst.

    Einfügen kannst du's per Insertionsort-Verfahren, das ist relativ einfach umzusetzen.
     
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.