Verständnisfrage zu Objektübergabe
Verständnisfrage zu Objektübergabe
Wenn ich jetzt zB eine ListView habe, die ich über eine Nebenklasse (AddIdentifierFormImpl) bearbeiten will und ich diese ListView folgendermaßen übergeben habe:
void KonfiguratorMainWindowImpl::slot_newEntry()
{
AddIdentifierFormImpl entry;
entry.showEntry(inputListView, outputListView);
}
und im Header der AddIdentifierFormImpl diese Public gemacht habe:
QListView *inputListView, *outputListView;
und dann in der showEntry diese dann folgendermaßen entgegen nehme:
void AddIdentifierFormImpl::showEntry(QListView *input,
QListView *output)
{
inputListView = new QListView(*input);
outputListView = new QListView(*output);
}
sollte das doch klappen, oder?
Wenn ich jetzt aber simple Sachen an der ListView mache, zB addColumn, dann geht das nur, wenn ich die Funktionen, in denen dieser addColumn-Befehl steht, direkt aus showEntry aufgerufen habe. Wenn ich diese aus einer anderen Funktion in meiner Klasse aufrufe, also einen Zwischenschritt habe, dann schmeisst er mir eine Windows-Speicherfehlermeldung raus, wenn ich auf die ListViews zugreifen will.
Habe ich da irgendwas falsch verstanden mit Objekten? Wäre schön, wenn Ihr mich aufklären könntet.
void KonfiguratorMainWindowImpl::slot_newEntry()
{
AddIdentifierFormImpl entry;
entry.showEntry(inputListView, outputListView);
}
und im Header der AddIdentifierFormImpl diese Public gemacht habe:
QListView *inputListView, *outputListView;
und dann in der showEntry diese dann folgendermaßen entgegen nehme:
void AddIdentifierFormImpl::showEntry(QListView *input,
QListView *output)
{
inputListView = new QListView(*input);
outputListView = new QListView(*output);
}
sollte das doch klappen, oder?
Wenn ich jetzt aber simple Sachen an der ListView mache, zB addColumn, dann geht das nur, wenn ich die Funktionen, in denen dieser addColumn-Befehl steht, direkt aus showEntry aufgerufen habe. Wenn ich diese aus einer anderen Funktion in meiner Klasse aufrufe, also einen Zwischenschritt habe, dann schmeisst er mir eine Windows-Speicherfehlermeldung raus, wenn ich auf die ListViews zugreifen will.
Habe ich da irgendwas falsch verstanden mit Objekten? Wäre schön, wenn Ihr mich aufklären könntet.
Ich konnte das Problem noch etwas eingrenzen:
Das entry-Objekt ist ein Fenster, über das ich einen String übergebe, vorher nach Gültigkeit überprüfe und wenn das stimmt, über den OK-Button eine Funktion aufrufe. Das Verändern der ListView ohne den Aufruf über den OK-Button geht wunderbar. Nur, wenn ich die Funktionen über das Entry-Objekt versuche aufzurufen, haut er mir die Speicherfehlermeldung raus.
Habe entry über die Header-Datei aber auch public gemacht:
AddIdentifierFormImpl *entry;
und in der AddIdentifierFormImpl-Klasse ja so aufgerufen:
entry = new AddIdentifierFormImpl();
Sollte also doch auch richtig sein, oder?
Das entry-Objekt ist ein Fenster, über das ich einen String übergebe, vorher nach Gültigkeit überprüfe und wenn das stimmt, über den OK-Button eine Funktion aufrufe. Das Verändern der ListView ohne den Aufruf über den OK-Button geht wunderbar. Nur, wenn ich die Funktionen über das Entry-Objekt versuche aufzurufen, haut er mir die Speicherfehlermeldung raus.
Habe entry über die Header-Datei aber auch public gemacht:
AddIdentifierFormImpl *entry;
und in der AddIdentifierFormImpl-Klasse ja so aufgerufen:
entry = new AddIdentifierFormImpl();
Sollte also doch auch richtig sein, oder?
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: Verständnisfrage zu Objektübergabe
Das ist falsch wenn Du von innerhalb AddIdentifierFormImpl auf input und output zugreifen willst. Richtiger istNotwist hat geschrieben: void AddIdentifierFormImpl::showEntry(QListView *input, QListView *output)
{
inputListView = new QListView(*input);
outputListView = new QListView(*output);
}
Code: Alles auswählen
void AddIdentifierFormImpl::showEntry(QListView *input, QListView *output)
{
inputListView = input;
outputListView = output;
}
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Danke für die Antwort. Komischerweise hab´ ich´s aber so sogar hinbekommen. Habe das aber mal mit Deinem Hinweis umgestellt und es geht auch und ist natürlich der richtigere Code. Sieht jetzt etwas doppelt gemoppelt aus, deswegen stelle ich das nochmal rein & frage Euch, ob das so richtig ist (abgesehen davon, dass es läuft):
Aus der Hauptklasse (entry hier ist ja nen ganz anderes entry als in AddIdentifierFormImpl):
void KonfiguratorMainWindowImpl::slot_newEntry()
{
entry.getListView(inputListView, outputListView);
}
In der Nebenklasse:
void AddIdentifierFormImpl::getListView(QListView *input,
QListView *output)
{
entry = new AddIdentifierFormImpl();
entry->inputListView = input;
entry->outputListView = output;
showEntry();
}
void AddIdentifierFormImpl::showEntry()
{
entry->validatorTextLabel->setText("Noch keine Eingabe vorgenommen...");
entry->okPushButton->setEnabled(FALSE);
entry->show();
}
Bisschen komisch ist, dass ich ja in der Hauptklasse erst ein Objekt der Nebenklasse erzeugen muss, um dann in der Nebenklasse noch einmal eines zu erzeugen, mit dem ich dann in der Nebenklasse weiterarbeite. Ist das so richtig oder gibt es da eine bessere Lösung. Ich warte auf den Groschen, der fällt!
Aus der Hauptklasse (entry hier ist ja nen ganz anderes entry als in AddIdentifierFormImpl):
void KonfiguratorMainWindowImpl::slot_newEntry()
{
entry.getListView(inputListView, outputListView);
}
In der Nebenklasse:
void AddIdentifierFormImpl::getListView(QListView *input,
QListView *output)
{
entry = new AddIdentifierFormImpl();
entry->inputListView = input;
entry->outputListView = output;
showEntry();
}
void AddIdentifierFormImpl::showEntry()
{
entry->validatorTextLabel->setText("Noch keine Eingabe vorgenommen...");
entry->okPushButton->setEnabled(FALSE);
entry->show();
}
Bisschen komisch ist, dass ich ja in der Hauptklasse erst ein Objekt der Nebenklasse erzeugen muss, um dann in der Nebenklasse noch einmal eines zu erzeugen, mit dem ich dann in der Nebenklasse weiterarbeite. Ist das so richtig oder gibt es da eine bessere Lösung. Ich warte auf den Groschen, der fällt!
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Ich verstehe nicht, warum du 'new AddIdentifierFormImpl()' machen musst. Eine einfache Zuweisung wie bei mir oben beschrieben reicht da doch aus. Im übrigen würde ich Klasseninterne Variablen mit 'm_' am Anfang bezeichnen damit man auf den ersten Blick sieht ob es eine interne oder eine übergebene oder globale Variable ist.
Also warum sollte es nicht so funktionieren?
Ausserdem ist getListView missverständlich. Es sollte wohl eher setListView heissen, da Du ja mit der Funktion die Listviews setzt und nicht zurückgibst.
Also warum sollte es nicht so funktionieren?
Code: Alles auswählen
void AddIdentifierFormImpl::getListView(QListView *input, QListView *output)
{
m_inputListView = input;
m_outputListView = output;
showEntry();
}
void AddIdentifierFormImpl::showEntry()
{
m_validatorTextLabel->setText("Noch keine Eingabe vorgenommen...");
m_okPushButton->setEnabled(FALSE);
show();
}
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Keine Ahnung, warum das nicht funktioniert. Jedenfalls, wenn ich es so mache, wie Du beschrieben, schmeisst er mir eine Speicherfehlermeldung raus, was darauf schliessen lässt, dass er mit den Objekten nicht richtig arbeiten kann.
Vielleicht liegt es daran, dass ich das Hauptfenster in Designer gemacht habe und davon die Klasse KonfiguratorMainWindowImpl ableite, um es verändern zu können. Sollte aber eigentlich nichts ausmachen. Und mache ich ja mit allen in Designer entworfenen Fenstern so.
Vielleicht liegt es daran, dass ich das Hauptfenster in Designer gemacht habe und davon die Klasse KonfiguratorMainWindowImpl ableite, um es verändern zu können. Sollte aber eigentlich nichts ausmachen. Und mache ich ja mit allen in Designer entworfenen Fenstern so.
Wenn du da eine Fehlermeldung bekommst, dann liegt das sicher nicht am Designer. Du scheinst noch irgendeinen anderen Fehler zu haben.Notwist hat geschrieben:Keine Ahnung, warum das nicht funktioniert. Jedenfalls, wenn ich es so mache, wie Du beschrieben, schmeisst er mir eine Speicherfehlermeldung raus, was darauf schliessen lässt, dass er mit den Objekten nicht richtig arbeiten kann.
Um den zu finden solltest mal etwas mehr Code posten, so dass wir erkennen koennen, wo du deine einzelnen Objekte instanziierst und von welchem Typ sie sind usw.
Du solltest dir ueberigens eine besser Benamung zulegen. Ich kann in deinem Beispiel leider nicht erkennen, ob irgendwelche Objekte Member einer Klasse sind, oder nur lokal erzeugt wurden.
Von der Sache her solltest dich aber wirklich eher an die Loesung von Christian81, denn deine schaut mir nicht wirklich gut aus, auch wenn sie irgendwie funktioniert.
Goos
Habe den Code nicht hier, aber morgen kann ich mehr posten. Nur noch eine Frage. Das Objekt entry der Klasse AddIdentifierFormImpl ist ja ein Fenster, das ich damit erzeuge. Wenn ich dies aber nun in der KonfiguratorMainWindowImpl erzeuge, um auf die neue Klasse zugreifen zu können, wie arbeite ich dann denn mit dem dort erzeugten Objekt in der Addident.-Klasse? Müsste ich ja dann auch übergeben. Das ist doch dann der Fehler, warum Christians Code nicht funktionieren kann oder nicht? Er hat keinen Bezug zu dem in KonfiguratorMainWindowImpl erzeugten Objekt. Oder?
Zum Programmierstil: Ja, da habt Ihr recht, bin noch nicht so erfahren im Programmieren und hab´ mir das meiste selbst beigebracht. Vielleicht habt Ihr ja noch ne Lektüre (vielleicht auch online), wo ich da was lernen kann.
Gruß, Notwist
Zum Programmierstil: Ja, da habt Ihr recht, bin noch nicht so erfahren im Programmieren und hab´ mir das meiste selbst beigebracht. Vielleicht habt Ihr ja noch ne Lektüre (vielleicht auch online), wo ich da was lernen kann.
Gruß, Notwist
...das du womit erzeugst?Notwist hat geschrieben:Habe den Code nicht hier, aber morgen kann ich mehr posten. Nur noch eine Frage. Das Objekt entry der Klasse AddIdentifierFormImpl ist ja ein Fenster, das ich damit erzeuge.
... auf welche "neue" Klasse? ...dort? ...Addident.-Klasse = AddIdentifierFormImpl ?Notwist hat geschrieben: Wenn ich dies aber nun in der KonfiguratorMainWindowImpl erzeuge, um auf die neue Klasse zugreifen zu können, wie arbeite ich dann denn mit dem dort erzeugten Objekt in der Addident.-Klasse?
Was muesstest du auch nach wohin uebergeben?Notwist hat geschrieben: Müsste ich ja dann auch übergeben. Das ist doch dann der Fehler, warum Christians Code nicht funktionieren kann oder nicht? Er hat keinen Bezug zu dem in KonfiguratorMainWindowImpl erzeugten Objekt. Oder?
Gruß, Notwist
Ich glaub das verrsteht kein Mensch so richtig:)
Versuchs doch nochmal ganz praezise zu erklaeren, am besten an einem ganz einfachen Beispiel mit Klasse A und Klasse B oder so aehnlich
Goos
Manchmal ist eine Nacht drüber schlafen das Beste. Habe den Fehler gefunden:
Hatte das entry-Objekt der Hauptklasse nicht public, sondern auf protected stehen. Peinlich! Jetzt geht der Code von Christian auch. Aber keine Angst, ich habe schon wieder eine neue Frage für Euch, dann aber im neuen Thread. Hoffe, das nervt nicht langsam!
Hatte das entry-Objekt der Hauptklasse nicht public, sondern auf protected stehen. Peinlich! Jetzt geht der Code von Christian auch. Aber keine Angst, ich habe schon wieder eine neue Frage für Euch, dann aber im neuen Thread. Hoffe, das nervt nicht langsam!