Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.12.2009, 21:08

Funktionsaufruf durch Pointer - Verständnisproblem

Hallo alle zusammen,

Vorab zu meiner Verteidigung: Ich habe das Buch bisher sehr gut verstanden, habe die Kapitel wirklich notfalls immer und immer wieder durch gelesen, bis es sitzt. Aber trotzdem habe ich folgendes Problem, wo meine Logik beginnt zu streiken:

Ich verstehe in Listing 9.4 nicht, warum die Funktion "starten ()" den Wert in m_ID wiedergeben kann. Woher weiß die Funktion "starten", dass sie die Werte aus der Liste "lSchiffe" nehmen soll und in den Platzhalter "m_ID" setzen soll. Hier der Code, damit die Frage auch Sinn ergibt:

--------------------------------------

C-/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
#include <iostream>
#include <list>

using namespace std;


class CRaumschiff
{
    public:

        // Memberfunktionen

        CRaumschiff  (int ID)
        {
            m_ID = ID;

            cout << "Raumschiff erstellt\n";
        }

        ~CRaumschiff () {cout << "Raumschiff zerstoert\n";}

        void Starten ()
        {
            cout << "Raumschiff startet" << endl;
            cout << "ID: " << m_ID << endl;
        }

    private:

        int m_ID;
};



int main ()
{
    list<CRaumschiff*> lSchiffe;
    list<CRaumschiff*>::iterator i;
    int Anzahl = 0;

    CRaumschiff *Temp = NULL;

    cout << "Wie viele Raumschiffe erzeugen: ";
    cin >> Anzahl;

    for (int j=0; j<Anzahl; j++)
       {
        Temp = new CRaumschiff (j+1);  

        lSchiffe.push_back (Temp); 

    }

    for (i=lSchiffe.begin(); i!=lSchiffe.end(); ++i)
    {
        (*i)->Starten ();
    }

    for (i=lSchiffe.begin(); i!=lSchiffe.end(); ++i)
    {
        delete (*i);
        (*i) = NULL;
    }

    lSchiffe.clear ();

    return 0;
}


Ich habe mal die Kommentare entfernt, um ein wenig Platz zu sparen. Mit (*i)->starten() greife ich ja auf die Funktion zu, aber anscheinend passiert da ja mehr als nur ein Zugriff. Was genau passiert denn da (ich zerbreche mir nun seit 2 Tagen den Kopf darüber) Ich bin wirklich jedem dankbar, der mir hilft, dies zu verstehen.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

02.12.2009, 21:30

In der Liste speicherst du ja Zeiger auf Instanzen der Klasse CRaumschiff. Nun ist der Sinn der Schleife, dass du jedes Element der Liste durchzugehen und dann die passende Funktion aufzurufen.

C-/C++-Quelltext

1
2
3
4
5
6
for (i=lSchiffe.begin(); i!=lSchiffe.end(); ++i)
{
    //(*i)->Starten (); // hinter dem *i versteckt sich ein Zeiger auf CRaumschiff also könntest du auch das hier machen:

    CRaumschiff* aktuelles_schiff = (*i);
    aktuelles_schiff->Starten ();
}


Das ist ja prinzipiell das gleich, wie wenn du da z.B 100 Variablen vom Typ CRaumschiff anlegst und dann jedes von Hand starten lässt. Da das aber sehr mühselig und nicht dynamisch ist, hast du da eine Liste, wo du die neu erstellten Objekte reinpacken kannst und dann auch völlig dynamisch durchgehen kannst.

Ich hoffe es ist ein wenig klarer geworden, sonst einfach Nachfragen! (es ist keine Schande zu Fragen!)

3

02.12.2009, 21:50

Vielen Dank Drakon. So wie du das gelistet hast, ist es natürlich um einiges Verständlicher. :idea:

Endlich kann ich mich trauen, die nächste Seite des Buches aufzuschlagen. Ich hoffe ich erlebe nicht wieder eine böse Überraschung :D

Wobei: Bei dem letzten Kapitel hatte ich schon meine Mühe. Ich Befürchte ich werde euch bald wieder auf die Nerven gehen müssen.

Nochmals Danke, bis bald

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

02.12.2009, 21:57

Kein Problem.

Allerdings solltest du den Spass an der Sache auch nicht vergessen. Manchmal kannst/solltest du etwas, was du nicht ganz verstehst vorerst überspringen und dann kannst du später wieder darauf zurück kommen und dir das ganze nochmal überlegen und dann wirst du wahrscheinlich das ganze besser verstehen können.

Aber wenn du es bis zur STL geschafft hast, wird der Rest auch nicht mehr zu schwer für dich sein! (und schon bald kommt das grafische Spiel!)

5

02.12.2009, 22:01

Ich werde deinen Rat beherzigen

Zitat von »"drakon"«


Aber wenn du es bis zur STL geschafft hast, wird der Rest auch nicht mehr zu schwer für dich sein!


Deine Worte in Gottes Gehör.

Bis dann! :D

Werbeanzeige