Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Zeigerproblem (kein Compilerfehler) in QtÜbung [close]  
Gehen Sie zu Seite 1, 2, 3, 4, 5, 6  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
wit
Mitglied

Benutzerprofil
Anmeldungsdatum: 21.08.2012
Beiträge: 30
Beitrag wit Mitglied 19:08:06 21.08.2012   Titel:   Zeigerproblem (kein Compilerfehler) in QtÜbung [close]            Zitieren

Hallo All,

ich hoffe ich bin hier richtig, aber meiner Meinung nach hat mein Fehler nichts mit Qt zu tun... Falls doch bitte ich um Entschuldigung und Verschiebung...

Zu meinem Problem, ich habe eine kleine Qt Anwendung aus bis jetzt 3 Fenstern gemacht, die ich alle über ein Signal/Slot Konzept öffne und schließe.
Folglich habe ich den Slot zusammen mit einem Zeiger auf die andere Klasse in der Klasse deklariert. Im Konstruktor initialisiere ich dann den Zeiger und dort ist auch mein Problem... Sobald ich namlich den Zeiger nicht mehr ausklammere (siehe unten) bekomme ich kein Fenster mehr, obwohl das Programm im Hintergrund laut Debugger läuft, oder habe ich da was falsch gemacht? Aber normalerweise kommt doch bei Fehlern ein PopUp... Ich habe keinen Schimmer woran das liegt. :confused:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
registration.h
[cpp]class Registration : public QDialog
{
          ...
    class Check *ptr;
    class Startfenster *ptr1;
};[/cpp]
 
registration.cpp
[cpp]Registration::Registration(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Registration)
{
           ...
    ptr = new Check(); //aber warum funktioniert es hier?
    ptr1 = new Startfenster(); //hier ist der Fehler, denn beim Ausklammern funktioniert es
          ...
}[/cpp]
 
check.h
[cpp]class Check : public QDialog
{
        ...
    class Registration *ptr2;
};[/cpp]
 
check.cpp
[cpp]Check::Check(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Check)
{
      ...
    ptr2 = new Registration(); //hier ist der selbe Fehler nochmal, denn beim Ausklammern funktioniert es}[/cpp]

}
Die Zeiger brauche ich für die Slots und das connecten zwischen den Ui´s... - ich kann sie also nicht weglassen...
Desweiteren dachte ich dann, dass es ganz schlau wäre ich sie dann im Destruktor delete?

Bitte um Hilfe und es würde mich sehr freuen, wenn ihr mir auch andere Fehler mitteilen könnt, die euch auffallen, da ich nämlich keinen Ansprechpartner habe und alles aus Google und Büchern lerne. :)
Danke im v******

PS: Das ist mein erster Beitrag, ich hoffe das passt so ;) - und nochmal sorry wegen falschem Forum

_________________
Danke für eure Hilfe!
Thanks for your help!


Zuletzt bearbeitet von wit am 12:16:34 31.08.2012, insgesamt 1-mal bearbeitet
Skym0sh0
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.03.2008
Beiträge: 1950
Beitrag Skym0sh0 Mitglied 19:12:32 21.08.2012   Titel:              Zitieren

was heisst denn ausklammern?
wit
Mitglied

Benutzerprofil
Anmeldungsdatum: 21.08.2012
Beiträge: 30
Beitrag wit Mitglied 19:17:48 21.08.2012   Titel:              Zitieren

als Kommentar verwenden, so suche ich meine Fehler meistens

_________________
Danke für eure Hilfe!
Thanks for your help!
manni66
Unregistrierter




Beitrag manni66 Unregistrierter 19:21:23 21.08.2012   Titel:              Zitieren

Der Fehler liegt wohl in einem der vielen "...".
Für ein connect brauchst du keine Zeiger als Member, und das connect könnte sogar völlig außerhalb der beteiligten Klassen stattfinden.
manni66
Unregistrierter




Beitrag manni66 Unregistrierter 19:24:28 21.08.2012   Titel:              Zitieren

Ich sehe gerade, der Konstruktor von Check ruft den Konstruktor von Registration auf, der den Konstruktor von Check aufruft, der den Konstruktor von Registration aufruft ...

Kann das sein?
Gero_Programmierstil_de
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.08.2012
Beiträge: 34
Beitrag Gero_Programmierstil_de Mitglied 19:29:37 21.08.2012   Titel:              Zitieren

Die Konstruktoren der Klasse Registration und von Check rufen sich gegenseitig auf. Das ist zumindest eins deiner Problem.

C++:
1
2
3
4
5
6
7
8
9
Registration::Registration()
->
ptr = new Check();
 
.....
 
Check::Check()
->
    ptr2 = new Registration();


Die rufen sich dann immer wieder gegenseitig auf, bis alles zerberstet.
Wird einer von beiden ausgeklammert, gehts natürlich.

Lösung:
Verlager das "new"'n der beiden Objekte ("new Registration()" und "new Check()") ganz woanders hin, un bau die Klassen so um, dass sie im Konstruktor gleich einen Zeiger zur jeweils anderen Instanz übergeben bekommen.
brauchst code dafür?
Gero_Programmierstil_de
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.08.2012
Beiträge: 34
Beitrag Gero_Programmierstil_de Mitglied 19:31:09 21.08.2012   Titel:              Zitieren

und mach in den .h files aus den

class Registration *ptr;

mal ein

Registration *ptr;

das class lässt man in dem fall weg.
wit
Mitglied

Benutzerprofil
Anmeldungsdatum: 21.08.2012
Beiträge: 30
Beitrag wit Mitglied 19:40:28 21.08.2012   Titel:              Zitieren

ok vielen Dank für deinen konstruktiven Beitrag, weil ich hab mir Mühe gegeben das möglichst gut zu kürzen :live:
das class mach ich gleich mal weg...
Aber das Andere würde ich gerne erstmal selber ausprobieren, schließlich will ich ja was lernen :D
und dann melde ich mich nochmal ob es jetzt geklappt hat

_________________
Danke für eure Hilfe!
Thanks for your help!
wit
Mitglied

Benutzerprofil
Anmeldungsdatum: 21.08.2012
Beiträge: 30
Beitrag wit Mitglied 21:22:28 21.08.2012   Titel:              Zitieren

also ich war grad beim Essen und habe dabei über deinen Lösungsvorschlag nachgedacht, nur leider verstehe ich es noch nicht :(

1. Sobald ich die class ´s in den "h."´s wegmache kommt folge Fehlermeldung: ISO C++ forbids declaration of 'Registration' with no type; expected ';' before '*' toke

2. weiß ich nicht wohin ich das new umbauen soll, denn wir befinden uns ja im Konstruktor also bleibt nur main und Klasse selbst
2.1 Klasse selbst, bekomm ich lauter Fehlermeldungen:
..\ProjektPD Sicherung\/registration.h:32: error: 'new' cannot appear in a constant-expression
..\ProjektPD Sicherung\/registration.h:32: error: ISO C++ forbids declaration of 'ptr' with no type
..\ProjektPD Sicherung\/registration.h:32: error: ISO C++ forbids initialization of member 'ptr'
..\ProjektPD Sicherung\/registration.h:32: error: making 'ptr' static
..\ProjektPD Sicherung\/registration.h:32: error: ISO C++ forbids in-class initialization of non-const static member 'ptr'
..\ProjektPD Sicherung\/registration.h:32: error: declaration of 'int Registration::ptr'
..\ProjektPD Sicherung\/registration.h:29: error: conflicts with previous declaration 'Check* Registration::ptr'
- da mach ich definitiv was ganz falsch

2.2 oder in die main und dann gehen alle connects (weil ich sie im Konstruktor habe) und slots nicht mehr, habe ich desweiteren schon vor einer Woche ohne Erfolg ausprobiert

3. Meinst du hiermit: " un bau die Klassen so um, dass sie im Konstruktor gleich einen Zeiger zur jeweils anderen Instanz übergeben bekommen. ", dass ich in einer Klasse eine Instanz auf die andere machen soll und darauf einen Zeiger?
Falls ja macht man das initialisieren bei new ja dann mit dieser Klammer "()", da QtKlassen aber für gewöhnlich einen default Zeiger auf 0 haben greif ich dann immer auf den zu und es funktioniert wieder nich

Wenn ich alles posten soll, dann sagt es aber ich wollte niemanden verschrecken und es wie in der Anleitung machen...


@manni66: Ich hab dich am Anfang leider falsch verstanden,nämlich dass ich nicht soviel ... machen soll und mein Posting gefälligst besser formulieren soll

Nun heute geht halt alles schief

_________________
Danke für eure Hilfe!
Thanks for your help!
Gero_Programmierstil_de
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.08.2012
Beiträge: 34
Beitrag Gero_Programmierstil_de Mitglied 21:43:01 21.08.2012   Titel:              Zitieren

Ich glaub, das praktischste ist, du lädst mal dein komplettes projekt hier hoch.
ich weiss schon, was du nicht verstehst, aber ich glaub, per code is einfachste weg, das zu vermitteln.

zu 1: Such mal nach "forward-declaration" und versuch zu verstehen, was das ist.
zu 2: "Klasse selbst" wäre schon der Konstruktor. der Konstruktor gehört zur Klasse.
zu 3: puhhhh. grad echt keine ahnung, wo ich da anfangen soll. hab auch nicht super krass viel ahnung von qt.
mein satz: "bau die Klassen so um, dass sie im Konstruktor gleich einen Zeiger zur jeweils anderen Instanz übergeben bekommen." war streng genommen aber auch falsch, fällt mir grad auf.
ich glaub, du brauchst einfach 2 neue methoden:

C++:
1
2
3
4
5
6
7
8
9
Registration::setCheckObject(Check *inCheck)
{
   this->ptr = inCheck;
}
...
Check::setRegistrationObject(Registration *inRegistration)
{
   this->ptr2 = inRegistration;
}

weisst du was ich meine?
c++.de :: C++ (auch C++0x und C++11) ::  Zeigerproblem (kein Compilerfehler) in QtÜbung [close]  
Gehen Sie zu Seite 1, 2, 3, 4, 5, 6  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.