Zeigerproblem (kein Compilerfehler) in QtÜbung [close]
-
Gutes Schlusswort dazu.
B2T: wit, weitergekommen?
-
ich bin grad erst heimgekommen und konnte folglich nicht weitermachen...
hmm, eigentlich habe ich was anderes mit meiner Frage gemeint, aber irgendwie ist sie schwachsinnig umso länger ich darüber nachdenke@gero: Ich glaube ich habe verstanden was du meinst, aber ich verstehe den Sinn nicht so ganz
Könntest du es mir bitte nochmal erklären?Edit: Ich mach jetzt erstmal alles in forward declarationen, bin vohin nimmer dazu gekommen...
Edit2: Obwohl was du mit der init methode meinst habe ich doch noch nicht gerafft... Sowas wie auf der 1 Seite, dumm frag
Edit 3: Das mit den Namen kann ich jetzt nimmer ändern werde ich aber in Zukunft machen
Desweiteren wollte ich noch sagen, auch wenn ihr das über gero amüsant findet, das ich sehr froh bin das er mir soetwas wie z.B. solche Namensgeschichten sagt, weil ich ja wie gesagt niemanden kenne
-
grml, also das mit dem schnell ins forward declarationen umwandeln hat schon mal nicht geklappt *rofl
aber jetzt wart ich mal den morgigen Tag ab, hab ja schon bissel was intus
Edit: Hat jetzt doch funktioniert war nur zu blöd
Edit2: Wow, compiliert der jetzt schneller, das der Unterschied so groß ist hätte ich nicht gedacht
-
So und weil ich grad eh schon am spamen bin, übersetze ich das richtig im Kontext?
0. Don't sweat the small stuff.
Mach dir keine Sorger über die unwichtigen Sachen?Don't overlegislate naming, but do use a consistent naming convention:
und hier was heißt das Wort "overlegislate"? - übertreiben?Hoffe ich nerv euch nicht zu sehr
aber wenn will ich schon alles wissen 
-
wit schrieb:
0. Don't sweat the small stuff.
Mach dir keine Sorger über die unwichtigen Sachen?So in der Art - "mach dir keinen Kopf um Kleinigkeiten" würds auch treffen.
Don't overlegislate naming, but do use a consistent naming convention:
und hier was heißt das Wort "overlegislate"? - übertreiben?overlegislate = zusammengesetzt over und legislate* -> nicht übermäßig reglementieren.
______________________
*siehe auch dt. Legislative = Gesetzgebung, von lat. lex/legis: das Gesetz => nicht als Klugscheißerei gemeint, aber oft kann man sich unbekannte Vokabeln aus Fremdwörtern oder lang vergangenen Lateinstunden herleiten
-
danke
pumuckl schrieb:
______________________
*siehe auch dt. Legislative = Gesetzgebung, von lat. lex/legis: das Gesetz => nicht als Klugscheißerei gemeint, aber oft kann man sich unbekannte Vokabeln aus Fremdwörtern oder lang vergangenen Lateinstunden herleiten
hab kein Larain... und dass das nicht als Klugscheißer gemeint ist, ist mir klar da braucht man sich bei mir keine Sorgen machen, kenne auch ein paar sehr intelligente Leute im Vergleich zu mir

Edit: Außerdem hätte ich dann nicht gefragt

-
Gero_Programmierstil_de schrieb:
joa die sätze sind en bisel unsinnig, aber ich glaub, wit meint folgendes:
er braucht in den klassen ja nicht ein komplettes objekt der anderen klassen, sondern halt jeweils nur einen zeiger. die schlussfolgerung, die objekte auf dem heap (oder auf dem stack, besser halt: überhaupt) zu kreieren, is allerdings falsch, die objekte brauchen jeweils nur zeiger, keine kompletten objekte, weder auf dem stack noch auf den heap.Mir ist grad noch eine Frage aufgekommen, auch wenn ich das in dem Fall nicht das gemeint hab... Fakt ist, aber ich hab aber mehr oder weniger so gedacht und vertehe jetzt noch nicht ganz warum die Schlussfolgerung jetzt falsch ist?
-
So ich hab jetzt noch ein bissel gebastelt und habe wie in deinem Beispiel im Konstruktor einen Zeiger deklariert...
aber was meinst du mit der initmethode?
und wo soll ich den Zeiger aus dem Konstruktor dann initialisieren?
-
it doesnt work!!

Ich hab jetzt mal so versucht wie du gesagt hast ohne Erfolg + CompilerfehlerDas habe ich jetzt gemacht...
Registration.h
#ifndef REGISTRATION_H #define REGISTRATION_H #include <QDialog> #include "ui_registration.h" class Check; class Startfenster; class Registration : public QDialog { Q_OBJECT public: explicit Registration(Startfenster *inStart, Check *inCheck, QWidget *parent = 0); ~Registration(); private slots: void setUpS(); void setUpC(); public: Ui::Registration *ui; Startfenster *Startm; Check *Che; void ini(); }; #endif // REGISTRATION_HRegistration.cpp
... Registration::Registration(Startfenster *inStart, Check *inCheck, QWidget *parent = 0) : QDialog(parent), ui(new Ui::Registration) { ui->setupUi(this); this->Startm = inStart; this->Che = inCheck; ini(); } ... void Registration::ini() { connect(ui->Zurueck, SIGNAL(clicked()), this, SLOT(setUpS())); connect(ui->Weiter, SIGNAL(clicked()), this, SLOT(setUpC())); //Werte übergeben connect(ui->Vorname, SIGNAL(textChanged(QString)), Che->ui->Vorname, SLOT(setText(QString))); ... } void Registration::setUpC() { Che->show(); Che->raise(); Che->activateWindow(); } ...main.cpp
... int main(int argc, char *argv[]) { QApplication app(argc, argv); Startfenster *inStart = new Startfenster; Registration *inRegis = new Registration; Check *inCheck = new Check; class Startfenster start(*inRegis); class Registration registratio(*inStart, *inCheck); class chec(*inRegis); start.show(); return app.exec(); }Compilerfehler:
main.cpp:12: error: no matching function for call to 'Startfenster::Startfenster()'
startfenster.h:14: note: candidates are: Startfenster::Startfenster(Registration*, QWidget*)
startfenster.h:10: note: Startfenster::Startfenster(const Startfenster&)
main.cpp:13: error: no matching function for call to 'Registration::Registration()'
registration.h:18: note: candidates are: Registration::Registration(Startfenster*, Check*, QWidget*)
registration.h:11: note: Registration::Registration(const Registration&)
main.cpp:14: error: no matching function for call to 'Check::Check()'
Check.h:16: note: candidates are: Check::Check(Registration*, QWidget*)
check.h:10: note: Check::Check(const Check&)
main.cpp:16: error: no matching function for call to 'Startfenster::Startfenster(Registration&)'
startfenster.h:14: note: candidates are: Startfenster::Startfenster(Registration*, QWidget*)
startfenster.h:10: note: Startfenster::Startfenster(const Startfenster&)
main.cpp:17: error: no matching function for call to 'Registration::Registration(Startfenster&, Check&)'
registration.h:18: note: candidates are: Registration::Registration(Startfenster*, Check*, QWidget*)
registration.h:11: note: Registration::Registration(const Registration&)
main.cpp:18: error: conflicting declaration 'chec* inRegis'
main.cpp:13: error: 'inRegis' has a previous declaration as 'Registration* inRegis'Bitte um weitere Hilfe der Experten
Edit: War das jetzt eigl. was du gemeint hast, gero?
-
geht schon in die richtige richtung.
hier ist erstmal nur kurz der korrigierte code:Registration.h
#ifndef REGISTRATION_H #define REGISTRATION_H #include <QDialog> #include "ui_registration.h" class Check; class Startfenster; class Registration : public QDialog { Q_OBJECT public: explicit Registration(Startfenster *inStart, Check *inCheck, QWidget *parent = 0); ~Registration(); public: void init(); // << ist jetz hier explizit als public deklariert private slots: void setUpS(); void setUpC(); private: // << die funktion init() soll public werden, die member-variablen sollen aber pivate bleiben. Ui::Registration *ui; Startfenster *Startm; Check *Che; }; #endif // REGISTRATION_HRegistration.cpp
... Registration::Registration(Startfenster *inStart, Check *inCheck, QWidget *parent = 0) : QDialog(parent), ui(new Ui::Registration), // !!! wichtig, dein code war auch richtig, aber so ist besser (guck dir vielleicht mal an, was initialisierungs-listen sind. Startm(inStart), Che(inCheck) { // egal was jetz hier noch passiert, Startm und Che sind schon gesetzt. ui->setupUi(this); // <<< ich weiss von qt leider zu wenig, aber vielleicht macht es sinn, diese zeile auch mit in die init() methode rüberzuziehen. // !!! wichtig // init(); //<< init() nicht hier im konstruktor aufrufen, das is wichtig /// init() haben wir eingeführt, damit das wirkliche echte initialiseren GERADE NICHT vom konstruktor gemacht wird. eine gute merk-regel ist: im konstruktor sollten grundsätzlich nur sachen gemacht werden, die auf gar keinen fall schief gehen können. } ... // hier kannst du nun rumhuren, mit allen was verfügbar ist ;) void Registration::init() { connect(ui->Zurueck, SIGNAL(clicked()), this, SLOT(setUpS())); connect(ui->Weiter, SIGNAL(clicked()), this, SLOT(setUpC())); //Werte übergeben connect(ui->Vorname, SIGNAL(textChanged(QString)), Che->ui->Vorname, SLOT(setText(QString))); ... } void Registration::setUpC() { Che->show(); Che->raise(); Che->activateWindow(); } ...main.cpp
... int main(int argc, char *argv[]) { QApplication app(argc, argv); // !!!! das hier ist auch wichtig: // erst werden objekte der klasse Check un Startfenster instantiert: Check *check = new Check(); Startfenster *start = new Startfenster(); // diese werden nun an den konstruktor von Registration übergeben: Registration *regis = new Registration(start , check /*, 0 */); // < die 0 für QWidget *parent fügt der compiler aufomatisch hinzu, wegen default-argument (=0). das hattest du ja schon verstanden... // das folgende is unsinng: // class Startfenster start(*inRegis); // class Registration registratio(*inStart, *inCheck); // class chec(*inRegis); // folgendes ist von mir hinzugefügt und wieder wichtig: regis->init() // <<< init() method wird aufgerufen start.show(); return app.exec(); }
-
ok, dann änder ich das mal und lese in meinem Buch nochmal Initialisierungslisten nach... Kann aber sein das ich mich erst übermorgen melde ob es funktioniert, da ich jetzt dann Besuch kriege

Das mit dem setupUi lass ich lieber, weil mit Qt habe ich jetzt erst vor einem halben Jahr angefangen und weiß folglich noch weniger als in C++
und ich möchte jetzt lieber nicht noch nen QtExperten von euch vollnerven...
-
habe jetzt noch geschafft, die Fehler auszubessern, habe aber leider neue Fehler bekommen während ich den Ersten noch lösen konnte

funktioniert irgendetwas mit deiner Initialisierungsliste nicht...meine main sieht jetzt so aus:
... class Registration *Regis; int main(int argc, char *argv[]) { QApplication app(argc, argv); Startfenster *Start = new Startfenster(Regis); Check *check = new Check(Regis); Registration *Regis = new Registration(Start, check); Start->ini(); Regis->ini(); check->ini(); Start->show(); ...Fehler ist folgender: startfenster.cpp:10: error: '((Startfenster*)this)->Startfenster::Regi' cannot be used as a function
sieht genau wie in deinem Post aus, außer das ich das setupUi gelassen habeNoch eine Frage in den richtigen Programmen sind dann die init-Dataien was wir jetzt als Funktion gemacht haben?
-
wit schrieb:
Fehler ist folgender: startfenster.cpp:10: error: '((Startfenster*)this)->Startfenster::Regi' cannot be used as a function
Code? Die Meldung besagt, dass du etwas (nämlich Regi) wie eine Funktion benutzt, was aber keine Funktion ist. (und auch keinen operator() hat)
sieht genau wie in deinem Post aus, außer das ich das setupUi gelassen habe
genauso nur ganz anders?

-
nun dann habe ich anscheinend das lesen verlernt

also bei mir sieht's so aus:Startfenster.cpp
Startfenster::Startfenster(Registration *inRegis, QWidget *parent) : QDialog(parent), ui(new Ui::Startfenster) { ui->setupUi(this); Regi(inRegis); }Mir fällt grad auf, dass du kein Semikolon gemacht hast, aber jetzt habe ich fast keine Zeit mehr, verdammt
-
Ich seh zwar immernoch nicht, was Regi sein soll, aber ich rate einfach mal, dass das der Registration-Pointer ist, der in den vorherigen Codebeispielen ptr hieß.
Und ich vermute mal dass du ihn mit dem übergebenen Wert von inRegis belegen willst. Wie du es aufrufst, ist es eine Initialisierung, die muss aber in die Initialisierungsliste. Im Konstruktor-Rumpf gibts nurnoch Zuweisungen, keine Initialisierungen mehr. Richtig wäre also:Startfenster::Startfenster(Registration *inRegis, QWidget *parent) : QDialog(parent), ui(new Ui::Startfenster), Regi(inRegis) //<-- initialisierung! { ui->setupUi(this); }Oder (weniger guter Stil)
Startfenster::Startfenster(Registration *inRegis, QWidget *parent) : QDialog(parent), ui(new Ui::Startfenster) //Regi wird nicht initialisiert... { ui->setupUi(this); Regi = inRegis; }Sollte ich mit meinen Vermutungen recht haben, solltest du dir im Buch deiner Wahn nochmal die Themen Initialisierung/Zuweisung, Initialisierungsliste etc. genauer zu Gemüte führen.
-
Danke für den Tipp!!
Ich werds gleich ausprobieren.
-
Sorry, das ich mich noch nicht früher gemeldet habe...
Leider funktioniert es noch immer nicht, der selbe Fehler wie zu Anfang kein Compilerfehler und kein Bild ich versuch mal den Fehler einzugrenzen und dann nochmal Code zu posten...Edit: Doch einen Unterschied!
Wenigstens kommen wir bzw. ihr mit meinem Problem weiter. Ich krieg folgenden Fehler: Rückgabewert -1073741819
Mal den Debugger durchlaufen lassen...
Edit2: Segmentation fault, anscheinend ein Zeigerfehler, werde mal schauen ob ich ihn finde, wenn nicht dann würde ich mich nochmal melden...
-
ich versteh es nicht

Debugger: Startfenster::ini()+136, aber da initialisier ich doch nichts???void Startfenster::ini() { setWindowTitle("Felix"); connect(ui->Registration, SIGNAL(clicked()), this, SLOT(setUpR())); connect(ui->Nachname, SIGNAL(textEdited(QString)), Regi->ui->Nachname, SLOT(setText(QString))); }oder was hei*t das? Ich google zwar weiter, wuerde mich aber ueber Tipps wie bisher sehr freuen

-
Mir ist und bleibt der Debugger trotz dieser schoenen Seite ein Raetsel ich poste jetztmal was meiner Meinung relevant ist...
Edit: Fehler gefunden:#include <QtGui/QApplication> #include "startfenster.h" #include "registration.h" #include "check.h" class Registration *Regis; int main(int argc, char *argv[]) { QApplication app(argc, argv); Startfenster *Start = new Startfenster(Regis); Check *check = new Check(Regis); Registration *Regis = new Registration(Start, check); Start->ini(); //hier Regis->ini(); //und hier check->ini(); //und hier Start->show(); return app.exec(); }
-
es klappt nicht... Würdet ihr mir bitte nochmal helfen, warum der Zeiger diesmal wieder nicht richtig initialisiert und ich "Segmentation fault" erhalte?
Vielen Dank schonmal für die wirklich tolle Hilfe bis hierhin, auch wenn das im Vergleich zu dem was ich hier gelernt habe leider viel zu wenig ist
