[C/C++] Designproblem / Verständnisproblem von Vector/eigene Klasse

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von blackworker, 11. März 2012 .

Schlagworte:
  1. 11. März 2012
    Designproblem / Verständnisproblem von Vector/eigene Klasse

    Hi,

    ich glaube ich bin grad an einer Stelle angelangt an der ich selber nicht mehr weiterkomme, bzw ein allgemeines Designproblem von meinen Programm vorliegt.

    Ich habe folgendes Problem/möchte folgendes Realisieren:

    Ich habe vor mir eine Art "Datenbank". Die sieht stellvertretend so aus:
    Code:
    Nummer Name
    123 Müller
    2345 hans
    423 Helga
    888267 Robert
    ...
    
    Das bedeutet ein Datensatz besteht aus Nummer und Name und gehört damit zusammen.
    Dazu kommt das ich mit den Daten arbeiten will (vergleichen, verändern, ausgeben, etc) und es soll dynamisch gehalten werden - es soll unter der Laufzeit Datensätze hinzugefügt/gelöscht werden können.

    Jetzt steh ich vor dem Problem, dass ich nicht weiß wie ich das am besten realisieren soll.

    Ich möchte gern mit der Vector-Klasse arbeiten, damit ich mich selber nicht um das dynamische Hinzufügen/Löschen der Elemente kümmern brauche. Aber bisher kenn ich die Vektor-Klasse nur mit einem Element. Z.B. vector <int> Telefonliste;

    Kann ich das auch irgendwie auf einen Datensatz erweitern? Zum Beispiel wenn ich ein struct Datensatz definiere, dass aus int Nummer und string Name besteht? vector <Datensatz> Daten;

    Dazu möchte ich dann auch eine eigene Klasse haben, die meine Methoden (ändern, ausgeben, etc...) beinhaltet und eben auf die ganze Datenbank Zugriff hat.

    Da check ich grad nicht wie ich das realisieren kann, dass ich von meiner eigenen Klasse auf die Daten von der Vektorklasse zugreifen kann, bzw gleich auf die Methoden meiner Klasse zugreifen kann?

    Oder bin ich vom Design her ganz falsch und es würd anders viel einfacher gehen? Ich steh grad völlig auf dem Schlauch
     
  2. 11. März 2012
    AW: Designproblem / Verständnisproblem von Vector/eigene Klasse

    Hallo!

    Muss das Programm möglichst performant sein?

    Falls nein, so bietet sich als einfachste Lösung die Nutzung einer (single-linked) Liste an. Die kannst du entweder einfach selbst implementieren oder du suchst dir eine API dazu. Der Nachteil davon ist, dass das Herausgreifen eines speziellen Elementes zugriffstechnisch aufwendig ist. Wenn du aber nur eine geringe Anzahl von Objekten im Speicher halten willst oder die Lösung nicht unbedingt die leistungsmäßig schnellste sein muss, dann ist die Liste eine gute Wahl.

    Wenn die Datensätze so ähnlich sind wie in deinem Beispiel (d.h. strukturiert, mit Möglichkeit von Zuordnung), dann könntest du die Performance verbessern, indem du Hash-Verfahren einsetzt, z.B. indem du ein Array von 10 Listen generierst, und dann neue Objekte entsprechend einer Hash-Funktion einsortierst. Damit würde die Suche u.s.w. schneller gehen, aber der Implementierungsaufwand ist entsprechend größer.

    Ich würde das so implementieren, dass ich eine Klasse/Struktur mit dem Datensatz definiere (der dann in Zukunft erweitert werden kann) und unabhängig davon eine Liste implementiere, in die dann die Datensätze eingefügt werden. Datenstruktur (Liste) und Datensatz in einer Klasse zu vermischen ist keine gute Idee. Die Methoden, die auf der Datenstruktur konkret arbeiten, sollten natürlich auch von der Datenstruktur- (abstrakt) und Datensatz-Klasse/Struktur getrennt sein.
    Wenn ich dann auf ein bestimmtes Objekt zugreifen will, durchlaufe ich die Liste, finde das Objekt (die Klasse) und rufe die Methoden, die ich brauche, darauf auf.

    Das heißt im Endeffekt hast du im einfachsten Fall drei Klassen:
    1.) Datenstruktur (z.B. Liste) - unabhängig
    2.) Datensatz (Menge von Attributen, Methoden) - unabhängig
    3.) Applikation (z.B. Suche, Vergleichen, ...) - benutzt Datenstruktur und Datensatz

    Mfg,

    Kolazomai
     
  3. 11. März 2012
    AW: Designproblem / Verständnisproblem von Vector/eigene Klasse

    Danke Kolazomai für deine Antwort!

    Nein, das Programm muss erstmal nicht besonders perfomant sein, es dient nur zum Verständnis von den Container-Klassen und wie man mit Daten am besten umgeht.

    Ich hab mir jetzt erstmal deinen Post ein paarmal durchlesen müssen, bis ich ihn richtig verstanden hab

    Also vornweg: Ja die Daten sind strukturiert, sie liegen immer in dieser Form vor: "Nummer Name"
    (Die sollen später von einer .txt-Datei eingelesen werden, deswegen möcht ichs auch dynamisch halten)

    Zu Übungszwecken möchte ich unbedingt mit der Vector-Class arbeiten.

    Deinen Ansatz finde ich gut, so in hab ich es mir auch vorgestellt, dass ich die Daten und meine eigene Methoden getrennt halte. Nur an der Realisierung haperts bei mir.

    Ich hätte es so versucht:

    1. Definition von einem Datensatz
    Code:
    struct Datensatz
    { int iNummer;
     string sName;
    };
    
    2. Erstellen einer "Datenbank"
    Code:
    vector<Datensatz> Datenbank;
    //Später wird dann mit Datenbank.push_back(Datensatz& hinzufügen_Datensatz) 
    //Daten hinzugefügt
    
    3. Erstellen einer eigenen Klasse, die auf "Datenbank" zugriff hat.
    So und hier haperts bei mir.
    Muss ich hier nochmal die Datenbank definieren damit ich drauf zugriff habe?
    Ich stell mir die Handhabung meiner Klasse später etwa so vor:
    -Werte vergleichen: bool gleich(Datensatz& D1, Datensatz& D2);
    -Name ändern: void aendernName(string Name);
    ...

    Ich weiß jetzt nicht ob ich mir verständlich ausgedrückt habe... bist du noch im IRC aktiv und hast Lust&Zeit? :]

    mfg
     
  4. 11. März 2012
    AW: Designproblem / Verständnisproblem von Vector/eigene Klasse

    Hallo!

    Es freut mich, dass ich dir bis hier schon einmal helfen konnte Ich bin nicht mehr im IRC unterwegs und werd auch höchstwahrscheinlich, zumindest in nächster Zeit, nicht wieder aktiv werden.

    Deine Lösung ist schon mal ein guter Ansatz. Ich würde das wie folgt ändern:

    1.) Datensatz für die einzelnen Zeilen
    Code:
    struct Datensatz
    {
     int iNummer;
     string sName;
    };
    2.) Klasse Datenbank für den Umgang mit den Datensätzen
    Code:
    class Datenbank
    {
    // Attribute der Klasse
     vector<Datensatz> daten;
     
    public:
    // Constructor
     Datenbank();
     Datenbank(string sTextdatei);
     
    // Eingabe
     bool einlesen(string sTextdatei);
    
    // Ausgabe
     Datensatz suche(int iNummer);
     Datensatz suche(string sName);
     
    // Meta
     bool gleich(Datensatz& D1, Datensatz& D2);
    };
    Mein C++ ist nicht so gut, der Code ist deshalb eher konzeptionell zu verstehen

    Ich hab also vector und Datensatz in der Klasse Datenbank zusammengeführt. Im Konstruktor kannst du dann vector initialiseren und (die) Textdatei(en) einlesen oder was auch immer nötig ist. Wie genau du vector benutzt (initialisieren, Daten einfügen, u.s.w.), dazu gibt es bestimmt gute Tutorials und Beispiele im Netz, das sollte kein großes Problem sein

    Du kannst, wenn du komplett objekt-orientiert vorgehen willst, "Datensatz" zu einer Klasse machen und Methoden wie "gleich" in der Klasse implementieren. Das wäre bezüglich OOP sauberer.

    P.S.: Ich bin ab morgen für eine Woche nicht da.

    Mfg,

    Kolazomai
     
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.