Autor Beitrag
Dhakiyah
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 327
Erhaltene Danke: 5

Windows 7
Delphi XE2
BeitragVerfasst: 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).

ausblenden volle Höhe C#-Quelltext
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];                                 // Was passiert hier?
        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);    // Was passiert hier?
            anzahl++;
        }
        
        void schliessen ()
        {
            delete window[anzahl-1];                          // Wieso - 1?
            anzahl--;
        }
        
        void show_verwaltung ()
        {
            for (int i = 0; i < anzahl; i++)
            {
                window[i]->show_data();                       // Was passiert hier? Was bedeutet das -> ?
            }
        }
};

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Mi 19.11.08 09:47 
Ich kenn mich mit C++ jetz nicht wirklich gut aus aber naja:

ausblenden Quelltext
1:
CFenster *window [100];                                 // Was passiert hier?					

window wird als Pointer(deswegen das *) auf ein Array, das aus 100 CFenster besteht, deklariert

ausblenden 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


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 19.11.08 10:42 
user profile iconDhakiyah hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
                window[i]->show_data();                       // Was passiert hier? Was bedeutet das -> ?					
In Delphi wäre das ein Punkt, da hieße es window[i].show_data();
window[i] ist ein Pointer auf ein Objekt und mit -> greifst du auf Elemente dieser Klasse zu. Auch das Dereferenzieren des Pointers wird dabei automatisch gemacht.
wikibooks hat folgendes geschrieben:
Der Operator -> („Pfeil“) besorgt Dereferenzierung und Memberzugriff in einem.
McSteel
ontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 54

Win XP
VS 6.0, VS2005
BeitragVerfasst: 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++.

ausblenden 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?

ausblenden 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;

ausblenden 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;

ausblenden 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.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
 for (int i = 0; i < 2; i++)
 {
     window[i]->show_data(); 
     //show_data ist eine Methode aus der Klasse CFenster
     //Note von jaenicke: Der Operator -> („Pfeil“) besorgt Dereferenzierung und Memberzugriff in einem.
     //Was heisst das Dereferenzierung?
 }


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


ausblenden C#-Quelltext
1:
    fvw.schliessen();					

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;

ausblenden 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

ausblenden 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;

ausblenden 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

ausblenden C#-Quelltext
1:
    system ("pause");					

Schritt 9: Konsole macht eine Pause, bis man eine beliebige Taste drückt. Kannte ich bisher nicht! Aber gut zu wissen!

ausblenden C#-Quelltext
1:
    getch ();					

Schritt 10: Was passiert hier? Was für eine Methode ist das?

ausblenden C#-Quelltext
1:
}					

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 327
Erhaltene Danke: 5

Windows 7
Delphi XE2
BeitragVerfasst: 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
ontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 54

Win XP
VS 6.0, VS2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 54

Win XP
VS 6.0, VS2005
BeitragVerfasst: 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 ;-)