getter/setter auf Listen



  • Hallo,

    bin noch neu - nicht nur in C++ sondern im ganzen Programmieren.
    Ich gehe mal davon aus, dass die Frage vielen Trivial scheinen wird oder schon mein Ansatz für die Lösung Quatsch ist...

    Folgendes Problem:
    In einem konsolengesteuerten Vektorrechenprogramm erstelle ich eine Vektorliste, denn ich kannte sonst keine Möglichkeit durchnummerierte oder anderweitig von der Benutzereingabe abhängig benannte Vektoren zu erstellen.

    Nun möchte ich mit Settern und Gettern auf die Liste zugreifen und sie manipulieren. Wie stelle ich das an?

    //Liste erstelle ich wie folgt
    Vector2f *vectorList[10];
    //später wählt der Nutzer aus der Liste einen Vektor zum erstellen/bearbeiten
    if (inputAction == 2)
    		{
    			double inputX, inputY;
    			int vecnr = 0;
    
    			cout << "\t" << "Option 2 chosen" << std::endl;
    
    			cout << "\t" << "Select vector to create or edit.(Select 0-9)" << endl;
    			cin  >> inputString;
    			vecnr = atoi (inputString);
    
    //danach sollen nach diesem Muster die Werte gewählt werden
    				cout << "\t" << "Vector " << vecnr << " was selected." << endl;
    				cout << "\t" << "Define parameters of Vector. " << vecnr << endl;
    				cout << "\t" << "Define X." << endl;
    				cin	 >> inputString;
    				inputX = atof(inputString);
    				vectorList[vecnr]->SetX(inputX);
    

    Wie muss SetX dann definiert werden?
    Wenn ich auf die Werte zugreifen will brauche ich ja auch GetX.
    Wie sage ich dem auf welchen Vektor aus der Liste er zugreifen soll?

    Bekomme bis jetzt beim debuggen immer die Fehlermeldung "...Zugriffsverletzung beim Schreiben an Position 0xcccccccc...". Denk mal das liegt daran, dass meine getter/setter nicht wissen wie sie mit der Liste umgehen sollen.

    Vielen Dank schonmal an alle die mir behilflich sein können. 🙂



  • Nimm STL-Container wie std::vector statt Arrays. Übrigens kannst du von den Streams direkt in Zahlen einlesen.

    std::vector<Vector2f> vectors;
    ...
    Vector2f newVector;
    std::cout << "Zwei Zahlen eingeben:" << std::endl;
    std::cin >> newVector.x >> newVector.y;
    vectors.push_back(newVector);
    

    Schau dir am besten ein gutes C++-Buch wie den C++ Primer an. Eine Dokumentation der Standardbibliothek findest du auf www.cppreference.com.



  • Du hast ein Array von Zeigern auf Vector2f. Vermutlich füllst du die Zeiger nie mit sinnvollen Werten => Absturz.
    Die Lösung hat Nexus ja schon gezeigt.



  • Danke für die schnelle antwort.
    Am Lesen bin ich schon fleissig, bekomme parallel aber auch schon so Übungen mit denen ich mich befassen muss.

    Auf die Container aus der vector klasse bin auch schon gestossen.
    Leider erst am Freitag abend, als ich schon den Ansatz mit der Liste hatte...
    werd das dann wohl gleich umbauen.

    Leider ist mir noch immer nicht klar, wie ich auf eine ebstimmte Position in dem Container zugreifen kann. In der Doku zu vector kann ich auch keine passende Funktion finden.

    Angenommen ich habe auf die von Dir angegebene Methode noch 3 weitere Vectoren in dem Container erstellt und möchte nun die Attribute von z.B. dem zweiten abfragen. Wie mache ich das?

    Den Inputstream habe ich umgewandelt, weil mir sonst das Programm amokgelaufen ist, sobald ein Buchstabe eingegeben wurde, da in der Vctor2f Klasse die werte als double definiert sind.
    Das kann man sicher auch geschickter umgehen, als mit atof, ist für den moment aber zweitrangig.



  • whatevr schrieb:

    Leider ist mir noch immer nicht klar, wie ich auf eine ebstimmte Position in dem Container zugreifen kann. In der Doku zu vector kann ich auch keine passende Funktion finden.

    operator[]



  • ...wer lesen kann ist klar im Vorteil...

    Das gibt mir dann ja den Vector2f zurück.
    Muss ich darauf dann einen getter anwenden um an die xyz ranzukommen, oder gibt es auch eine elegantere Variante?

    Wenn ich die Doku richtig verstehe, bedeutet,

    vector( vector&& other )

    dass ich z.B. auch einen std::vector<std::vector<double>> erstellen könnte.

    Werd das jetzt ersteinmal ausprobieren.
    Muss das dann beispielweise so aussehen wenn ich den 2. Wert des 5. Vektors haben möchte?

    return foo[5[2]];
    

    Vielen Dank nochmal für die Hilfe!



  • whatevr schrieb:

    Muss ich darauf dann einen getter anwenden um an die xyz ranzukommen, oder gibt es auch eine elegantere Variante?

    Hängt von deiner Vektorklasse ab. std::vector::operator[] gibt nur eine Referenz auf ein Objekt dieser Klasse zurück, um den Rest musst du dich selbst kümmern.

    whatevr schrieb:

    Wenn ich die Doku richtig verstehe, bedeutet,

    vector( vector&& other )

    dass ich z.B. auch einen std::vector<std::vector<double>> erstellen könnte.

    Du kannst zwar Container verschachteln, allerdings hat die Syntax vector&& nichts damit zu tun. Die && in diesem Kontext bezeichnen eine RValue-Referenz, welche zur Implementierung von Move-Semantik verwendet wird. Damit kannst du Objekte ineinander "verschieben", d.h. unnötige Kopien vermeiden.

    whatevr schrieb:

    Muss das dann beispielweise so aussehen wenn ich den 2. Wert des 5. Vektors haben möchte?

    return foo[5[2]];
    

    Nein, sondern foo[5][2] (aber denk dran, die Zählung beginnt bei 0). Generell würde ich verschachtelte Container nur einsetzen, wenn du darin einen Vorteil siehst. Du kannst nämlich auch alles auf eine Dimension abbilden und Indizes umrechnen.



  • Danke Nexus!

    Sehr hilfreich.

    Ohne Verschachtelung läuft auch schon ein Teil des Rechners.

    Würde bei der Gelegenheit auch gerne gleich verstehen, wie ich so eine Verschachtelung aufbauen könnte.

    Was muss ich denn Beispielhaft in die <> schreiben, damit er auch Vektoren in Form von std::vector aufnimmt?
    Bei allen Varianten, die mir bis jetzt eingefallen sind beschwert er sich über fehlende Argumentelisten der "Klassenvorlage "std::vector"".
    Damit kann ich leider nur wenig anfangen....


  • Mod

    Was soll denn der vector in deinem vector für einen Typ speichern können? Das musst du natürlich noch mit angeben.

    Aber: Sieh das eher als intellektuelle Übung. Sehr viele Anfänger denken, sie bräuchten verschachtelte vectoren (eine sehr komplexe und somit langsame Datenstruktur), dabei brauchen sie eigentlich einen vector<array> oder einen vector<Typ> mit einem 2D-Wrapper drumherum. Diese beiden wären jedenfalls die erste Wahl, wenn man eine "rechteckige" 2D-Datenstruktur möchte (wobei bei vector<array> die Länge der inneren Dimension zur Compilezeit fest wäre). vector<vector> ist hingegen eine Liste von Listen, das heißt, jeder innere Eintrag hat auch flexible Länge, gänzlich unabhängig von der Länge aller anderer Einträge. Wenn man es braucht, braucht man es (dann ist vector<vector> auch eine sehr effiziente Lösung), wenn nicht, dann verschenkt man jede Menge Rechenzeit, wenn man es trotzdem nutzt.

    P.S.: Ich schreibe hier im Text so salopp vector<vector> bzw. vector<array>, das ist natürlich nicht die vollständige Syntax. Wie schon im ersten Absatz erklärt, gehört da natürlich noch zu, auf welchem Typen überhaupt gearbeitet werden soll.



  • Was soll denn der vector in deinem vector für einen Typ speichern können? Das musst du natürlich noch mit angeben.

    Ist eigentlich genau das, was ich wissen wollte.
    Was für ein Typ ist denn vector?
    Bzw. was müsste ich für einen Typ bei einer vector<vector<double>> Verschachtelung angeben.
    Letzendlich wäre das ja eine Liste von double Listen.
    Würde gerne einfach mal die Syntax kennenlernen...quasi als intellektuelle Übung.


  • Mod

    Du hast dir die Antwort selber gegeben. vector<double> ist vom Typ vector<double>.



  • seltsam...auf die Weise habe ich immer einen Fehler über fehlende Argumentelisten bekommen.

    Habe heut Mittag wahrscheinlich wieder irgendeinen total blöden Fehler (fehlendes Leerzeichen z.B.) gemacht...
    Habe einen Thread mit passenden Beispielen gefunden falls jemand auf der Suche über diesen hier stolpert.

    http://www.c-plusplus.net/forum/138752-full

    Also vielen Dank für die Hilfe.
    Das Pogramm ist auch schon fast fertig. 🙂


Anmelden zum Antworten