| Autor |
Beitrag |
Dhakiyah
      
Beiträge: 327
Erhaltene Danke: 5
Windows 7
Delphi XE2
|
Verfasst: Mi 19.11.08 09:30
Hallo!
Da ich nicht weiß wohin damit, packe ich es mal hier hin. Ist ja nichts riesiges...
Programm läuft und funktioniert auch, allerdings weiß ich bei manchem nicht, was bzw. wieso er das macht. Hab das, was ich nicht verstehe, als Kommentar dahinter geschrieben.
Ich mache es als C# Code, es ist aber C++ (kenne die Unterschiede nicht).
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: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103:
| # include <iostream> # include <conio.h>
using namespace std;
class CFenster { private: int breite, hoehe, x, y; char name [20]; public: CFenster () { breite = 0; hoehe = 0; x = 0; y = 0; strcpy(name, "nicht definiert"); } CFenster (int a, int b, int c, int d, char *e) { breite = a; hoehe = b; x = c; y = d; strcpy(name, e); } void show_data () { cout<<endl<<"Name: "<<name; cout<<endl<<"Breite: "<<breite; cout<<endl<<"Hoehe: "<<hoehe; cout<<endl<<"x-pos: "<<x; cout<<endl<<"y-pos: "<<y<<endl; } ~CFenster () { cout<<"Speicher freigeben."<<endl; getch (); } };
class CFVerwaltung { private: CFenster *window [100]; int anzahl; public: CFVerwaltung () { anzahl = 0; for (int i = 0; i < 100; i++) { window [i] = NULL; } } ~CFVerwaltung () { for (int i = anzahl-1; i >=0; i--) { delete window [i]; } } void oeffnen (int a, int b, int c, int d, char *e) { window[anzahl] = new CFenster (a, b, c, d, e); anzahl++; } void schliessen () { delete window[anzahl-1]; anzahl--; } void show_verwaltung () { for (int i = 0; i < anzahl; i++) { window[i]->show_data(); } } };
int main () { CFVerwaltung fvw; fvw.oeffnen(10,10,10,10,"Fenster 1"); fvw.oeffnen(20,20,20,10,"Fenster 2"); fvw.show_verwaltung(); fvw.schliessen(); fvw.show_verwaltung(); fvw.oeffnen(30,30,100,10,"Fenster 3"); fvw.show_verwaltung();
system ("pause"); getch (); } |
Vielen Dank.
LG
Jasmin
_________________ Es ist soooo flauschig !!!
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Mi 19.11.08 09:47
Ich kenn mich mit C++ jetz nicht wirklich gut aus aber naja:
Quelltext 1:
| CFenster *window [100]; // Was passiert hier? |
window wird als Pointer(deswegen das *) auf ein Array, das aus 100 CFenster besteht, deklariert
Quelltext 1:
| delete window[anzahl-1]; // Wieso - 1? |
Weil die ein Array immer mit dem Index 0 beginnt.
z.B. wenn die Anzahl 1 ist hast du in window[0] ein Element
Quelltext 1: 2:
| window[anzahl] = new CFenster (a, b, c, d, e); // Was passiert hier? anzahl++; |
in das array window wird an der position "anzahl" ein neues Fenster zugewiesen, da "Anzahl" hier um 1 höher ist als die indexierung des arrays(siehe oben) ist anzahl also die indexierung des nächsten freien bereiches in dem array
danach wird die Anzahl erhöht
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 19.11.08 10:42
|
|
McSteel
      
Beiträge: 54
Win XP
VS 6.0, VS2005
|
Verfasst: Mi 19.11.08 12:41
Du muß das Programm im ganzen anschauen. Ich versuche mal zu erklären, wie das ganze abläuft. Falls ich eine Feher mache, dann korrigiert mich, ich lerne selbst die Programmiersprache C++.
C#-Quelltext 1: 2: 3:
| int main () { CFVerwaltung fvw; |
Schritt 1: Hier wird das Objekt fvw von der Klasse CFVerwaltung abgeleitet. Im Konstuktor von der Klasse CFVerwaltung wird ein ARRAY von Typ CFenster mit 100 leeren Schubfächer deklariert! richtig?
C#-Quelltext 1:
| fvw.oeffnen(10,10,10,10,"Fenster 1"); |
Schritt 2: Hier wird das erste Objekt der Klasse CFenster initialisiert. In der Methode "void oeffnen ()" habe ich ein Problem mit der Variable anzahl, wo kommt dessen Wert her? Sie wird nicht wie in CSharp übergeben, wie z.B. void oeffnen(int a, int b, int c, int d, char *e, int anzahl)
Ich habe es entdeckt im Konstruktur des CFVerwaltung wird die Varibale anzahl mit dem Wert 0 initialisiert.
D.h., hier wird das erste neue Objekt von der Klasse CFenster initialisiert:
window(0) = new CFenster (10,10,10,10, "Fenster 1")
anzahl++; => anzahl = 0; 0 + 1 = 1; => anzahl = 1;
C#-Quelltext 1:
| fvw.oeffnen(20,20,20,10,"Fenster 2"); |
Schritt 3: Hier wird das 2. Objekt von der Klasse CFenster initialisiert.
window(1) = new CFenster (20,20,20,20, "Fenster 2")
anzahl++; => anzahl = 1; 1 + 1 = 2; => anzahl = 2;
C#-Quelltext 1:
| fvw.show_verwaltung(); |
Schritt 4: Was passiert hier? Hier wird die Methode show_verwaltung aufgerufen. Ich setzt hier den Wert 2 aus Schritt 3 für die Variable anzahl ein.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| for (int i = 0; i < 2; i++) { window[i]->show_data(); } |
Ausgabe in der Console:
Name: Fenster 1
Breite: 10
Hoehe: 10
x-pos: 10
y-pos: 10
Name: Fenster 2
Breite: 20
Hoehe: 20
x-pos: 20
y-pos: 20
C#-Quelltext
Schritt 5: Die Methode schliessen wird aufgerufen. Die Variable anzahl hat der Wert 2. Setze ich es in dieser Methode ein:
delete window[2-1];
window[1] wird gelöscht, window[2] haben wir ja noch nicht.
anzahl--; => 2 - 1 = 1
anzahl = 1;
C#-Quelltext 1:
| fvw.show_verwaltung(); |
Schritt 6: Dies mal wird nur das 1.Fenster angezeigt. Das zweite Fenster wurde in Schritt 5 entfernt.
Ausgabe in der Console:
Name: Fenster 1
Breite: 10
Hoehe: 10
x-pos: 10
y-pos: 10
C#-Quelltext 1:
| fvw.oeffnen(30,30,100,10,"Fenster 3"); |
Schritt 7: Hier wird wieder das 2. Objekt von der Klasse CFenster initialisiert.
window(1) = new CFenster (30,30,100,10, "Fenster 3")
anzahl++; => anzahl = 1; 1 + 1 = 2; => anzahl = 2;
C#-Quelltext 1:
| fvw.show_verwaltung(); |
Schritt 8: Es werden 2 Objekte von der Klasse CFenster angezeigt
Ausgabe in der Console:
Name: Fenster 1
Breite: 10
Hoehe: 10
x-pos: 10
y-pos: 10
Name: Fenster 3
Breite: 30
Hoehe: 30
x-pos: 100
y-pos: 10
C#-Quelltext
Schritt 9: Konsole macht eine Pause, bis man eine beliebige Taste drückt. Kannte ich bisher nicht! Aber gut zu wissen!
C#-Quelltext
Schritt 10: Was passiert hier? Was für eine Methode ist das?
C#-Quelltext
Schritt 11: Ende der Methode mit dem geschweiften Klammer
Gruss Metin
_________________ McSteel: Mein Urlaubsort würde ich nicht verraten, denn sonst ist es ja kein Urlaub
|
|
Dhakiyah 
      
Beiträge: 327
Erhaltene Danke: 5
Windows 7
Delphi XE2
|
Verfasst: Mi 19.11.08 12:49
Was Dereferenzierung heißt weiß ich auch nicht.
getch () = Wartet auf einen Tastendruck.
Sollen wir machen, damit man sieht, dass der Destruktor auch aufgerufen wird.
LG
Jasmin
_________________ Es ist soooo flauschig !!!
|
|
McSteel
      
Beiträge: 54
Win XP
VS 6.0, VS2005
|
Verfasst: Mi 19.11.08 12:57
Mir ist das Thema Dereferenzierwn eines Pointers oder Allgemein das Thema Pointer nicht klar.
Wofür ist das gut? Wann brauche ich den?
Ich brauche da etwas detailierte Hilfe! Aus dem Buch werde ich noch nicht so schlau...
_________________ McSteel: Mein Urlaubsort würde ich nicht verraten, denn sonst ist es ja kein Urlaub
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 19.11.08 13:58
Also, dann werde ich das mal erklären:
Ein Pointer ist ja eine Variable, in der die Adresse eines Speicherbereichs drin steht. Nehmen wir an wir haben die Variable a, die an Position 0xAA im Speicher steht und eine Variable b, die auf diese Variable a zeigt, ein Pointer also. b steht sagen wir mal an Position 0xBB im Speicher und hat den Wert 0xAA.
Jetzt kann ich Variable a beschreiben indem ich einfach einen Wert zuweise, dann wird an die Position 0xAA, wo ja die Variable liegt, dieser Wert geschrieben. Wenn ich aber b einen Wert zuweise, dann wird an Position 0xBB geschrieben. Denn dort liegt ja b. Wir wollen aber, dass an die Stelle geschrieben wird wohin b zeigt. Dafür muss der Pointer dereferenziert, also sozusagen die darinstehende Adresse benutzt werden, und dann wird an dieser Position geschrieben. In diesem Fall also an Position 0xAA, denn das ist der Wert, der in b steht.
Bildlich gesprochen:
Ich habe ein Regal, in dem Äpfel liegen. Dort kann ich direkt welche reinlegen. Jetzt habe ich in einem anderen Regal statt Äpfeln nur einen Zettel, in dem steht, dass die Äpfel stattdessen in einem bestimmten anderen Regal liegen. Also muss ich diesem Hinweis folgen um die richtige Stelle zu finden. Das ist dann das Dereferenzieren. 
|
|
McSteel
      
Beiträge: 54
Win XP
VS 6.0, VS2005
|
Verfasst: Mi 19.11.08 18:13
Jetzt habe ich es verstanden, danke dir jaenicke.
_________________ McSteel: Mein Urlaubsort würde ich nicht verraten, denn sonst ist es ja kein Urlaub
|
|
|