Pointer auf einen Vector
-
Moin,
ich bin neu hier und habe auch gleich ein dickes Problem. Leider ist der Original-Quellcode mittlerweile ca. 50 Seiten lang und entsprechend kompliziert, deshalb muss ich im Folgenden eine stark vereinfachte Version davon angeben. Das prinzipielle Problem ist aber genau dasselbe. Also folgendes:Ich habe ein selbst erstelltes Objekt:
//Datei: Objekt.h #ifndef _OBJEKT_ #define _OBJEKT_ class Objekt { private: int x; public: Objekt(); int getX(); void setX(int x); }; #endif // _OBJEKT_ // Datei: Objekt.cpp #include "Objekt.h" Objekt::Objekt() { } int Objekt::getX() { return x; } void Objekt::setX(int x) { this->x = x; }
Soweit nix spannendes. Nun habe ich aber noch eine andere Klasse, in der ein Vector dieser Objekte erstellt und mit N Objekten gefüllt wird. Dieser Vector soll dann in einer dritten Klasse (AndereKlasse) ausgegeben werden und zu diesem Zweck wird ein Pointer auf diesen Vector übergeben.
//Datei: Programm.cpp #include <vector> #include "Objekt.h" #include "AndereKlasse.h" int main() { const int N = 10; std::vector<Objekt> objektVektor; for (int i = 0; i<N; i++) { Objekt tempObjekt; tempObjekt.setX(i); objektVektor.push_back(tempObjekt); } AndereKlasse ak; ak.setPointer(&objektVektor); ak.ausgabe(); return 0; };
Und hier noch die andere Klasse:
//Datei: AndereKlasse.h #include <vector> #include "Objekt.h" #include <iostream> class AndereKlasse { private: std::vector<Objekt>* pointer; public: AndereKlasse(); void setPointer(std::vector<Objekt>* pointer); void ausgabe(); }; //Datei: AndereKlasse.cpp #include "AndereKlasse.h" AndereKlasse::AndereKlasse(){ } void AndereKlasse::setPointer(std::vector<Objekt>* pointer) { this->pointer = pointer; } void AndereKlasse::ausgabe() { std::vector<Objekt>::iterator it = (*pointer).begin(); while (it != (*pointer).end() ) { std::cout << (*it).getX() << std::endl; it++; } }
Wenn ich das nun in meinem richtigen Programm genauso umsetze, dann kompiliert er zwar und es läuft auch im Prinzip, allerdings erhält man nur für das erste Objekt im Vector den richtigen Wert für x. Bei allen anderen Objekten liefert er Quatsch.
Wenn ich die Ausgabemethode jedoch ganz genau so unter die main-Methode setze und dann von dort aus aufrufe, dann liefert er für alle Elemente das richtige Ergebnis.
Wenn ich den Vector hingegen als static-Objekt direkt in der Objekt-Klasse anlege, dann klappt es über Umwege zwar auch, allerdings halte ich das für keine Elegante Lösung, weil dann ja nur ein Vector gleichzeitig moeglich ist und alle Klassen Zugriff auf ihn haben würden. Nicht gerade objekt-orientiert.
Irgendeine Idee, woran das liegen könnte?
PS: Ich progge erst seit kurzem in C++ und habe vorher Jahre lang Java und Fortran verwendet. Also bitte nicht hauen, falls ich irgendwelche C++ Normen noch nicht so ganz drauf habe.
Edit1: Bei der Sache mit dem "unter die main-Methode setzen" meine ich logischerweise, dass dann kein Pointer mehr übergeben wird. Entsprechend müssen dann auch die Sternchen entfernt werden.
Edit2: Ein paar Flüchtigkeitsfehler behoben.
Edit3: Noch ein paar Flüchtigkeitsfehler.
-
Olli Garch schrieb:
Leider ist der Original-Quellcode mittlerweile ca. 50 Seiten lang und entsprechend kompliziert, deshalb muss ich im Folgenden eine stark vereinfachte Version davon angeben. Das prinzipielle Problem ist aber genau dasselbe.
Sorry mit dem hier geposteten Code kann ich den Fehler nicht nachvollziehen.
Hast Du eventuell zu stark vereinfacht? Der Fehler scheint irgendwo auf der Strecke geblieben zu sein. Was gut und normal ist.
Denn: Von hier ausgehend Komplexität wieder hinzuzufügen, bis der Fehler wieder auftritt, heisst die Ursache zu lokalisieren.Abgesehen davon: der Code, wie Du ihn gepostet hast compiliert nicht:
Klasse2
istAndereKlasse
? Und die Konstruktoren fehlen.
-
Der vector wird wohl nicht mehr existieren, während du noch munter einen Pointer darauf benutzt. Legst du im echten Programm den Vector auch auf dem Stack an?
-
Furble Wurble schrieb:
Sorry mit dem hier geposteten Code kann ich den Fehler nicht nachvollziehen.
Hast Du eventuell zu stark vereinfacht? Der Fehler scheint irgendwo auf der Strecke geblieben zu sein. Was gut und normal ist.
Denn: Von hier ausgehend Komplexität wieder hinzuzufügen, bis der Fehler wieder auftritt, heisst die Ursache zu lokalisieren.Abgesehen davon: der Code, wie Du ihn gepostet hast compiliert nicht:
Klasse2
istAndereKlasse
? Und die Konstruktoren fehlen.Danke für die schnelle Antwort.
Die Komplexität des Programms ist eigentlich schon sehr realitätsnah, denn viel mehr als hier passiert in meinem echten Programm diesbzgl. bisher auch nicht. Es wird halt ganz genauso ein Pointer auf genau so einen Vector übergeben und dann wird eine int-variable abgefragt und ausgegeben. Diese int-variable hat eigentlich einen anderen Zweck, aber der ist bisher noch nicht implementiert und somit egal.Und die Sache mit Klasse2 und den Konstruktoren waren natürlich bloß Flüchtigkeitsfehler. Danke für den Hinweis. Ich werde es gleich ändern.
Manni66 schrieb:
Der vector wird wohl nicht mehr existieren, während du noch munter einen Pointer darauf benutzt. Legst du im echten Programm den Vector auch auf dem Stack an?
Ja, der Vector wird genauso angelegt und er existiert wohl auch noch, denn die Schleife macht die richtige Anzahl an Durchläufen, nur leider sind die erhaltenen Werte falsch.
-
Olli Garch schrieb:
Manni66 schrieb:
Der vector wird wohl nicht mehr existieren, während du noch munter einen Pointer darauf benutzt. Legst du im echten Programm den Vector auch auf dem Stack an?
Ja, der Vector wird genauso angelegt und er existiert wohl auch noch, denn die Schleife macht die richtige Anzahl an Durchläufen, nur leider sind die erhaltenen Werte falsch.
Diese Schlussfolgerung halte ich für gewagt. Speicher statt des Pointers eine Kopie des Vektors in der Klasse. Funktioniert es dann richtig?
-
manni66 schrieb:
Diese Schlussfolgerung halte ich für gewagt. Speicher statt des Pointers eine Kopie des Vektors in der Klasse. Funktioniert es dann richtig?
Ja, dies funktioniert problemlos, aber das war mir auch schon vorher klar. Leider kommt das aber nicht in Frage, weil sich die Größe des Vectors während des Programmablaufs ändern wird und ich nicht jedes Mal mehrere hundert Objekte übergeben will. Mein Programm ist auch so schon langsam wie sau.
Trotzdem danke für die Idee.Mein Vermutung ist ja, dass das Problem am Iterator liegt und man in so einem Fall einen anderen Interator nehmen muss. Dies würde auch erklären, wieso für das erste Element des Vectors die richtigen Werte angezeigt werden und für die anderen nicht.
Leider ist ein Iterator der Form(vector<Objekt>*)::iterator it;
jedoch nicht möglich.
-
Man muss keinen anderen Iterator nehmen. Ich gehe davon aus, dass der Zeiger ungültig ist. Aber ohne Code kann man nur raten ...