Seite 1 von 1
Vektor von Objekten an Klasse übergeben
Verfasst: 28. April 2009 14:50
von Stepp
Hallo,
versuch grad weiter in QT ein Programm umzusetzen und zwar:
Programm soll am Ende so aussehen:
Im Hauptmenuefenster gibt es einen Button der bei betätigen ein weiteres Fenster öffnet, wo bestimmte Informationen ausgegeben werden.
ich hab eine Klasse Test und dann eine Klasse für das QT Hauptmenue und die Klasse Fenster (erbt von QDialog).
In der Klasse vom Hauptmenue wird ein Vector mit Objekten der Klasse Test erstellt und diesen brauche ich in der Klasse Fenster, um auf die Variablen der Objekte zugreifen zu können.
Ich hab das bis jetzt mit einer Memberfunktion der Klasse Fenster versucht, in der dort noch ein Vector von Objekten Test definiert wird und diesen von der Klasse Hauptmenue übergeben bekommt. Dies führt nur dauernd zu nem Speicherzugriffsfehler. Hab noch rumprobiert mit Referenzen zu arbeiten, führte aber zu keinem Ergebnis.
Dazu noch ein anderes Problem:
Wenn ich das bei mir zuhause so nur versuche, dass der Vektor im Hauptmenue deklariert wird und ich dort auf die Variablen der einzelnen Objekte zugreifen will, wird das zwar kompiliert, aber das Programm stürzt beim Start sofort ab und auf Linux funktioniert das zumindest soweit ohne Fehlermeldung. Woran liegt das?
Vielen Dank schon mal.
Verfasst: 29. April 2009 12:41
von RHBaum
Zeig mal code ...
Ich hab das bis jetzt mit einer Memberfunktion der Klasse Fenster versucht, in der dort noch ein Vector von Objekten Test definiert wird und diesen von der Klasse Hauptmenue übergeben bekommt.
Schuss ins blaue:
Du gibst ne referenz / zeiger auf nen Object (vielleicht der container selber, oder auch die elemente drin) die nur local in der Funktion gueltig sind, also automatisch beim aussprung geloescht werden ?
Ciao ...
Verfasst: 19. Mai 2009 17:08
von Stepp
Ok, glaub das ist schlauer den C++ Code zu zeigen. Zeigt jetzt die wichtigsten Sachen. Problem ist in der klassenmenue.cpp:
hauptmenue.hpp:
Code: Alles auswählen
#ifndef HAUPTMENUE_H
#define HAUPTMENUE_H
#include <QPushButton>
#include <QWidget>
#include <QVBoxLayout>
#include <QMessageBox>
#include "klassenmenue.hpp"
#include "Klasse.hpp"
class Hauptmenue : public QWidget
{
//Q_OBJECT
public:
Hauptmenue(QWidget *parent = 0) ;
void IntToString(int i, char* buffer) ;
unsigned int CountLines() ;
string Klassenindex() ;
string Klassenindex2() ;
int klasseladen() ;
private:
QPushButton *Klassenbutton, *Beendenbutton ;
QVBoxLayout* layout_HM ;
Klassenmenue* klassenmenue ;
Klasse test ;
vector<Klasse> Klassenvektor;
};
#endif
hauptmenue.cpp:
Hab die memberfunktionen weggelassen, weil die für das Problem nicht wichtig sind.
Code: Alles auswählen
#include "hauptmenue.hpp"
#include <QApplication>
#include "Klasse.hpp"
using namespace std ;
Hauptmenue::Hauptmenue(QWidget *parent) : QWidget(parent)
{
//Klassenvektor erzeugen
klasseladen() ;
//Elemente des Hauptmenues erzeugen
Klassenbutton = new QPushButton("Klasse") ;
Beendenbutton = new QPushButton("Beenden") ;
layout_HM = new QVBoxLayout(this) ;
klassenmenue = new Klassenmenue ;
klassenmenue->get_vektor(Klassenvektor) ;
//Klassenvektor[1].get_Name() ;
//Elemente ins Hauptmenuelayout einbinden
layout_HM->addWidget(Klassenbutton) ;
layout_HM->addWidget(Beendenbutton) ;
//Signale einrichten
connect(Beendenbutton, SIGNAL(clicked()), qApp, SLOT(quit())) ;
connect(Klassenbutton, SIGNAL(clicked()), klassenmenue, SLOT(exec())) ;
setWindowTitle("Hauptmenue - Auswahl") ;
}
klassenmenue.hpp:
Code: Alles auswählen
#ifndef KlassenMENUE_H
#define KlassenMENUE_H
#include <QDialog>
#include <QPushButton>
#include <QVBoxLayout>
#include <QLabel>
#include <QComboBox>
#include <QMessageBox>
#include "Klasse.hpp"
class Klassenmenue : public QDialog
{
//Q_OBJECT
public:
Klassenmenue() ;
void get_vektor(vector<Klasse>& test) ;
private:
vector<Klasse> Klassenvektor2;
} ;
#endif
klassenmenue.cpp
Code: Alles auswählen
#include "klassenmenue.hpp"
#include <QApplication>
using namespace std ;
Klassenmenue::Klassenmenue()
{
QPushButton *Beendenbutton = new QPushButton("Zurueck") ;
QVBoxLayout *layout_FM = new QVBoxLayout(this) ;
QComboBox *klassenbox = new QComboBox ;
//Comboxbox füttern mit Filmvektor
//Klassenvektor2[1].get_Name() ; //hier ist das Problem, hier kommts zum Speicherzugriffsfehl
klassenbox->addItem("test");
//Layout
layout_FM->addWidget(klassenbox) ;
layout_FM->addWidget(Beendenbutton) ;
//connect Funktionen
connect(Beendenbutton, SIGNAL(clicked()), this, SLOT(close())) ;
//setModal(true) ; //Toplelvelfenster
setWindowTitle( "Klassenmenue" ) ;
}
void Klassenmenue::get_vektor(vector<Klasse>& test)
{
//Klassenvektor2 = test ; //
}
Verfasst: 19. Mai 2009 19:31
von solarix
Code: Alles auswählen
//Klassenvektor2[1].get_Name() ; //hier ist das Problem, hier kommts zum Speicherzugriffsfehl
Zu diesem Zeitpunkt ist Klassenvektor2 ja auch noch leer... wie wär's also, da vorher was reinzufüllen?
Dazu noch ein anderes Problem:
Beispielcode?
Verfasst: 20. Mai 2009 15:25
von Stepp
solarix hat geschrieben:Code: Alles auswählen
//Klassenvektor2[1].get_Name() ; //hier ist das Problem, hier kommts zum Speicherzugriffsfehl
Zu diesem Zeitpunkt ist Klassenvektor2 ja auch noch leer... wie wär's also, da vorher was reinzufüllen?
Danke für die Antwort.
Hm, wenn ich doch in der hauptmenueklasse den Klassenvektor mit der Memberfunktion an die Klassenmenue-Klasse übergebe, müsste der Klassenvektor2 doch nicht mehr leer sein?! Habs jetzt in der Memberfunktion auskommentiert, weils eh nicht funktioniert hat, aber von der Implementierung ists sonst richtig?!
Dazu noch ein anderes Problem:
Beispielcode?
Glaub das Problem ist zur Zeit nicht mehr gegeben.
Verfasst: 20. Mai 2009 15:52
von franzf
Stepp hat geschrieben:solarix hat geschrieben:Code: Alles auswählen
//Klassenvektor2[1].get_Name() ; //hier ist das Problem, hier kommts zum Speicherzugriffsfehl
Zu diesem Zeitpunkt ist Klassenvektor2 ja auch noch leer... wie wär's also, da vorher was reinzufüllen?
Danke für die Antwort.
Hm, wenn ich doch in der hauptmenueklasse den Klassenvektor mit der Memberfunktion an die Klassenmenue-Klasse übergebe, müsste der Klassenvektor2 doch nicht mehr leer sein?!
Code: Alles auswählen
Klassenmenue::Klassenmenue()
{
QPushButton *Beendenbutton = new QPushButton("Zurueck") ;
QVBoxLayout *layout_FM = new QVBoxLayout(this) ;
QComboBox *klassenbox = new QComboBox ;
//Comboxbox füttern mit Filmvektor
//Klassenvektor2[1].get_Name() ; //hier ist das Problem, hier kommts zum Speicherzugriffsfehl
Ich seh bis zu diesem Punkt NIRGENDS eine Befüllung von Klassenvektor2. Alles andere ist hier irrelevant!
Wenn du den vector brauchst, übergib ihn im Konstruktor.
Verfasst: 20. Mai 2009 16:40
von Stepp
ah ja...äh muss ich dann das mit dem einlesen wieder überarbeiten. Hatte eigentlich schon in der hauptmenue-klasse funktioniert. Hm, versuch grad das wieder zum laufen zu kriegen. Danke soweit...