given_to_fly Geschrieben 6. September 2003 Geschrieben 6. September 2003 Hallo. Ich habe mal eine kleine Frage zu Instanzen im Programm erzeugen. Ich habe eine grafische Oberfläche auf der man einen Button drücken kann. In der Methode (ButtononClick) erzeuge ich eine Instanz meiner selbstdefinierten Klasse abc. also abc klasse_inst; int i , b , k; So nun fülle ich ein paar protected werte mit den methoden aus meiner klasse. Wenn ich den button erneut drücke erzeugt er ja wieder eine instanz namens klasse_inst, aber diese ist doch schon definiert oder ? Oder verliert er diese wieder nach verlassen der Methode ButtononClick ?! Gut die Werte sind ja in der Klasse , aber d.h. ich könnte niemals werte speichern wenn ich keine eigene klasse definiere, da er ja alle werte wieder verliert ? Oder merkt der Compiler, das die Instanzt schonmal definiert worden ist und löscht die alte und erzeugt eine neue ?! Ich verstehe das nicht so ganz.... Denn sonst würde der Compiler ja eine doppeldefiniton anmeckern. Hoffe ihr wisst was ich meine ... :confused: Zitieren
robotto7831a Geschrieben 6. September 2003 Geschrieben 6. September 2003 Hallo, ich bin mir da nicht so ganz sicher. Mach doch einfach einen zweiten Button der Methoden der Klasse aufruft und Werte wieder ausgibt. Am besten machst Du beim drücken des ersten Buttons eine Abfrage welchen Wert er speichern soll. Dann hast Du verschiedene Werte in der Klasse. Warum machst Du die Instanz nicht beim Start des Programms/ Formulars auf? Frank Zitieren
given_to_fly Geschrieben 6. September 2003 Autor Geschrieben 6. September 2003 Original geschrieben von palvoelgyi Hallo, ich bin mir da nicht so ganz sicher. Mach doch einfach einen zweiten Button der Methoden der Klasse aufruft und Werte wieder ausgibt. Am besten machst Du beim drücken des ersten Buttons eine Abfrage welchen Wert er speichern soll. Dann hast Du verschiedene Werte in der Klasse. Warum machst Du die Instanz nicht beim Start des Programms/ Formulars auf? Frank Hi. Weil ich die Instanz erst beim Button drücke benötige Die Werte werden ja problemlos in der Klasse gespeichert , das ist nicht das Problem und warum er die behält ist auch klar... Ich frage mich nur wie er das mit den Instanzen handelt, da die Instanz ja schon existiert... Zitieren
Orffi Geschrieben 6. September 2003 Geschrieben 6. September 2003 Vielleicht verstehe ich dich nicht richtig, aber onClick ist ja eine Funktion, die irgendwie so ähnlich aussehen muß: void onClick (...) { meineKlasse test; //... } Wenn Du also auf deinen Button klickst, dann wird diese Funktion ausgefüht und Deine protected-Werte gefüllt. Wenn Du jetzt nochmal auf den Button klickst, dann hast Du folgendes NICHT bedacht: test ist lokal und wird vom Stack wieder abgeräumt, sobald die Funktion beendet wurde. Das bedeutet, Du kannst nicht wirklich etwas speichern und jedes mal wird test angelegt und am Ende wieder abgeräumt. Warum machst Du in Deiner Formularklasse, zu der auch onClick gehört nicht eine private oder sonstwas Variable meineKlasse *test. Dann kannst Du in onClick mit test = new meineKlasse(); eine Instanz Deiner Klasse erzeugen. Wenn Du jetzt ölfter auf den Button klickst erzeugst Du auch mehrere Instanzen, nur das Du nur noch auf die letzte Instanz zugreifen kannst. (Achtung Speicherloch, also aufpassen!!!) HTH Jan Zitieren
given_to_fly Geschrieben 6. September 2003 Autor Geschrieben 6. September 2003 Um es jetzt einmal zu verdeutlichen hier mein Original Code ////////////////////////////////////////////////////////////////////// // L O A D - B U T T O N - P U S H E D ////////////////////////////////////////////////////////////////////// void CRaffDlg::OnButtonLoad() { // Datendeklaration own_save class_w; int i = 6; class_w.set_werte(i); } Natürlich wird der i wert mit etwas anderem gefüllt, was ich aus anderen programmteilen ermittele Nun wenn ich auf den Button drücke wird die Instanz ja erzeugt und der Wert in der Klasse own_save mit der instanz class_w gespeichert. Wenn ich jetzt nochmals auf den Button klicke ist die Instanz ja noch da oder refernziert er wieder auf den name class_w und merkt , das ich schon vorher mal werte auf die klasse über die instanz geschoben habe und hat dann noch die werte im speicher ?! Oder wird eine neue Instanz erzeugt, aber woher hat er dann die Werte die ich vorher in die Atrribute (protected) der Klasse geschoben habe... Zitieren
Orffi Geschrieben 6. September 2003 Geschrieben 6. September 2003 Es ist so, wie ich sagte. Dein Objekt class_w ist lokal und wird auf dem Stack angelegt. Nach Beendigung wird das Objekt abgeräumt. Anders sieht es aus, wenn Du Dein Objekt den Zusatz static mitgibst. Dann funktioniert es so, wie Du es Dir vorstellst. Oder wird eine neue Instanz erzeugt, aber woher hat er dann die Werte die ich vorher in die Atrribute (protected) der Klasse geschoben habe... Bist Du sicher, daß die Werte noch vorhanden sind? HTH Jan Zitieren
given_to_fly Geschrieben 6. September 2003 Autor Geschrieben 6. September 2003 Original geschrieben von Orffi Bist Du sicher, daß die Werte noch vorhanden sind? HTH Jan ich habe jetzt von hand nochmal alle vorgänge durch debugged... Und du hast recht, die werte waren weg, es ist mir aber nie aufgefallen, da ich noch nicht so weit bin das ich wieder auf die werte zurückgreife, da ich die werte in der gleichen methode "CRaffDlg::OnButtonLoad" wieder auslese. ( Brauche Sie später aber wieder) Dann werde ich die Instanz mit der Variabele jedes mal neu erzeugen Es kann ja maximal 3 mal auf den button gekilckt werden das wird schon nicht den speicher überlasten Many thx , damit hast du mir extrem weitergeholfen und damit verstehe ich den zusammenhang mit Instanzen und lokalen Definitionen Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.