Lister / Fabrik / Pointer ....zu viel für mich



  • Hi!
    Ich komme nicht weiter, ist wohl schon zu spät für mich:
    Mich holt die Pointerei wieder etwas ein, in Java wär die Aufgabe im Null-Kommma-Nichts von mir erledigt:

    1. Ich habe eine Klasse 'Liste'
    2. Liste enthält eine Liste, bzw. Array (damit die Reihenfolge konstant bleibt) von 'Element'en.
    3. Mein Hauptprogramm soll mit der Liste / den Elementen arbeiten.
    4. Die Elemente sind in einem Textfile definiert und sollen deshalb von einem Parser ausgelesen und geantwortet werden.

    Da hört dann bei mir auf:
    - Element-Array oder int*-Array?
    - Liste und Elemente mit new XY() anlegen und im entsprechenden Destruktor deleten?
    😕 😕 😕

    Hilfe! Vielleicht auch mit etwas Samplecode, es hakt bei mir schon beim Zuordnen einer erzeugten Element-Instanz zu dem Array der Liste....
    Daaanke!



  • SammyRukka schrieb:

    2. Liste enthält eine Liste, bzw. Array (damit die Reihenfolge konstant bleibt) von 'Element'en.

    Wieso ist die Reihenfolge in einem Array konstant und in einer Liste nicht?

    Da hört dann bei mir auf:
    - Element-Array oder int*-Array?

    Nicht seh ehrlich gesagt nicht, wie du auf int* kommst. In das Array sollten doch Elemente hast du oben gesagt.

    - Liste und Elemente mit new XY() anlegen und im entsprechenden Destruktor deleten?

    Soll es jetzt ein Array sein? Ob du das mit new anlegen musst oder nicht hängt davon ab, ob die Größe zur Compilezeit oder zur Laufzeit erst festgelegt ist. Ab einer gewissen Größe ist new aber definitiv zu empfehlen.
    Oder gleich std::vector statt Arrays.



  • SammyRukka schrieb:

    - Element-Array oder int*-Array?

    erste Wahl für Array(s) sind immer Container der STL

    SammyRukka schrieb:

    - Liste und Elemente mit new XY() anlegen und im entsprechenden Destruktor deleten?

    immer erst versuchen die Liste oder die Elemente auf den Stack zu legen. Das Anfordern und Freigeben von Speicher überlässt man dem Container.

    SammyRukka schrieb:

    Hilfe! Vielleicht auch mit etwas Samplecode, es hakt bei mir schon beim Zuordnen einer erzeugten Element-Instanz zu dem Array der Liste....

    Hier ein Beispiel:

    #include <iostream>     // cout, endl
    #include <fstream>      // ifstream
    #include <vector>
    #include <algorithm>    // copy
    
    class Liste // eine Klasse Liste
    {
    public:
        typedef int Element; // der Typ 'Element' war nicht weiter spezifiziert
    
        // --   Einlesen (bis Streamende oder Fehler)
        friend std::istream& operator>>( std::istream& in, Liste& liste )
        {
            using namespace std;
            vector< Element > buf( (istream_iterator< Element >( in )), istream_iterator< Element >() );
            swap( buf, liste.m_elemente );
            return in;
        }
        // --   Ausgeben
        friend std::ostream& operator<<( std::ostream& out, const Liste& liste )
        {
            using namespace std;
            copy( liste.m_elemente.begin(), liste.m_elemente.end(), ostream_iterator< Element >( out, " " ) );
            return out;
        }
    
        // public Member sind nicht üblich, aber es ist unspezifiziert, wie main die Elemente nutzen soll.
        std::vector< Element > m_elemente;  // die Klasse Liste hält Elemente
    };
    
    int main()
    {
        using namespace std;
        Liste l;
        ifstream datei( "input.txt" );
        datei >> l; // Liste aus Datei einlesen
        cout << "Datei gelesen mit " << l.m_elemente.size() << " Eintraegen" << endl;
        cout << "Elemente:\n" << l << endl; // Liste auf cout ausgeben
        return 0;
    }
    

    Die Datei "input.txt" sieht so aus:

    1 2 3 44 5 6 7 88 -9

    und die Ausgabe des Progrmms so:

    Datei gelesen mit 9 Eintraegen
    Elemente:
    1 2 3 44 5 6 7 88 -9

    Gruß
    Werner



  • Danke ersteinmal.

    Ich war (warum auch immer) davon ausgegangen, dass die Reihefolge im Vector eher zufällig ist, deshalb habe ich mich gleich mit einem Array beschäftigt.

    Die entscheidende Aussage hätte ich natürlich auch extra dazuschreiben können:
    Die Anzahl der Elemente ergibt sich erst beim Parser der Datei - also zur Laufzeit.
    Auf int*[] bin ich gekommen, weil.... keine Ahnung, war vielleicht zu spät. Habe das mit Element[] nicht hinbekommen, da passte ihm etwas nicht, vielleicht waren die Elemente außerhalb der Parser-Methode nicht mehr korrekt.

    Ich versuche den Kram halt auch zu Verstehen und suche die eleganteste Lösung.


Anmelden zum Antworten