Qt: Elemente eines Konstructors werden gelöscht sobald eine andere Klasse aufgerufen wird
-
Hallo alle miteinander,
es würde mich freuen, wenn ihr mir bei folgendem Problem behhilflich sein könntet.
Ich definiere ein array mit allen zugehörigen Elementen im Konstruktor einer Klasse A. Nun möchte ich diese Werte in meiner Klasse B nutzen.Sobald aber der Konstruktor in Klasse A verlassen wird, werden alle Elemente meines Arrays gelöscht. Weiß vielleicht irgendwer woran das liegen könnte?
Unten habe ich nochmal mein Problem in einem sample-Code beschrieben:Zunächst die Klasse A:
class A() { A(); QVector<Point3d> point_s; } A::A() { point_s.resize(5); for (int i = 0; i < 5; ++i) { point_s[i].x = i; point_s[i].y = i+1; point_s[i].z = i+2; } }
In Klasse B möchte ich nun die Werte meines Arrays nutzen. Ich erstelle ein Objekt der Klasse A:
#include "a.h" #include "c.h" class B : public QGLWidget { Q_OBJECT public: A *a; C *c; void paintGL(); B(QWidget *parent = 0); } B::B(QWidget *parent) : QGLWidget(parent) { a = new A; b = new B; } void B::paintGL() { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluPerspective(70, width() / height(), 0.01, 1000); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); c->draw(a->point_s); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); }
Klasse mag hier sinnlos erscheinen. Ist aber in meinem Programm essentiell.
class C { public: C(); void draw_points(QVector<Point3d> point); void draw(QVector<Point3d> point) const; }; C::C() { } void C::draw_points(QVector<Point3d> point) { int count =1; double angle= 360/count; for(int i=0;i<5;i++) { glRotated(angle,0,1,0); draw(point); } } void C::draw(QVector<Point3d> point) const { for(int i=0; i<point.size(); i++) { glBegin(GL_POINTS); glVertex3f(point.value(i).x,point.value(i).y,point.value(i).z); glEnd(); } }
Ich habe auch schon versucht die Werte mit getter zu erhalten:
In a.cpp:
QVector<Point3d> A::get_m() { return this->point_s; }
In a.h:
QVector<Point3d> get_m();
In b.cpp:
b_points = a->get_m(); c->draw(b_points);
Wobei das keinerlei Veränderung bringt. Ich versteh das irgendwie nicht.
Ich wäre für eure Hilfe sehr dankbar....
-
Sobald aber der Konstruktor in Klasse A verlassen wird, werden alle Elemente meines Arrays gelöscht.
Wie kommst du auf diese Aussage? Hast du das überprüft? Der Code jedenfalls legt dies nicht nahe.
-
Wenn ich mir mit cout die Werte ausgeben lasse, sind diese zwar im konstruktor aber an jeder anderen stelle außerhalb kriege ich immer 0. Egal ob size oder ein bestimmter array-Wert.
-
Generell kann der gepostete Code nicht der sein, der bei dir läuft. Alles um Klasse A kompiliert nicht (class A**()**, Kein Konstruktor deklariert aber Definiert).
Poste mal bitte genau das, was du zu class A bei dir stehen hast - Copy&Paste, um Fehler beim Abtippen auszuschließen.
-
Ich hab jetzt die Konstruktordeklaration mit eingefügt. Das hab ich nur vergessen.
Ansonsten sollte eigentlich alles so richtig sein. Ich hab auch an diesem sample-code getestet. Ich kriege den gleichen Fehler.
-
Ok ich sehe gerade dass du Recht hast. Eigentlich erwartet nämlich mein Konstruktor einen QString.
A::A(QString &filePath)
Ich dachte das wäre nicht weiter relevant und würde meine Problembeschreibung nur verkomplizieren, was es sicherlich auch tut.
Naja also jedenfalls ist es eigentlich so, dass mein array erstellt wird aus einer datei(obj), welche in mein Programm geladen wird.
Dies geschieht in einer anderen Klasse
D:: D() { a = new A; } static A *loadModel(const QString &filePath) { return new A(filePath); } void OpenGLScene::loadModel() { loadModel(QFileDialog::getOpenFileName(0, tr("Choose model"), QString(), QLatin1String("*.obj"))); } void OpenGLScene::loadModel(const QString &filePath) { if (filePath.isEmpty()) return; setModel(::loadModel(filePath)); } void OpenGLScene::setModel(A *m) { delete a; a = m; update(); }
Ich dachte es würde an der Klasse A liegen.
Aber das Problem liegt wohl doch tiefer. Dieses Modelle reinladen bringt mich um.
Diesen Teil hab ich nämlich von einem Beispiel übernommen und dachte dass das schon passen wird.
Naja also wahrscheinlich könnt ihr mir bei dem großen Problem nicht helfen, aber ich hätte noch ein paar Verständnisfragen. Ich muss das jetzt wohl doch richtig nachvollziehen müssen:Und zwar versteh ich nicht 100%-ig diesen Code. Besonders dieses
return new A(filePath);static A *loadModel(const QString &filePath) { return new A(filePath); }
Für alle die jetzt stöhnen und sagen: "Oh mann das ist doch Basic XY", bitte ich mir das XY zu benennen. Denn ich hab mir alles autodidaktisch beigebracht und habe natürlich nicht so das Strukturwissen wie andere.
Auf jeden Fall wäre mir schonmal sehr geholfen wenn ihr mir das mit dem loadmodel erklären könntet.Also ich möchte es gerne lernen und verstehen.
Vielen lieben Dank
-
evtl. meinst du dynamische speicheranforderung
-
Also wenn ich das richtig verstehe wird hier
static A *loadModel(const QString &filePath) { return new A(filePath); }
neuer Speicher für den Konstruktor der Klasse A reserviert, oder? Und sonst passiert in diesem Teil gar nichts weiter?
Warum reservieren die da den Speicher für den Konstruktor? Hat das irgendwelche Vorteile? Könnte man das auch anders machen?