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

Teiby

Frischling

  • »Teiby« ist der Autor dieses Themas

Beiträge: 42

Beruf: Ausbildung

  • Private Nachricht senden

1

23.11.2011, 20:57

Listing 9.10 Klassenaufruf nicht nachvollziehbar

Guten Abend. Ich bin derzeit bei den Multimaps angekommen. Also Multimaps ansich versteh ich, aber nun hab mal spaßhalber das Programm erweitert und was dabei rauskommt, kann ich nicht ganz nachvollziehen.
Der Codeauschnitt ist 1:1 aus dem Buch. Alles was ich hinzugefügt hab, hab ich in Großschrift dazugeschrieben als Kommentar.

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
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// C++ für Spieleprogrammierer
// Listing 9.10
// Multimaps
//
#include <iostream>
#include <map>
#include <string>

using namespace std;

// Eine kleine Klasse, die der Einfachheit halber
// die Membervariablen öffentlich hält und die
// Memberfunktionen innerhalb der Deklaration implementiert
//
class CMinenleger
{
    public:

        // Membervariablen
        int m_Energie;          // Energie des Minenlegers
        int m_Geschwindigkeit;   // Geschwindigkeit des Minenlegers
        int m_AnzahlMinen;      // Anzahl der mitgeführten Minen

        // DIESER FUNKTIONSAUFRUF IST NEU DAZU
        CMinenleger()
        {
            cout << "Klasse \"CMinenleger\" wurde aufgerufen" << endl;
        }

        // Memberfunktionen
        void ZeigeDaten ()      // Daten des Minenlegers anzeigen
        {
            cout << "Energie        : " << m_Energie << endl;
            cout << "Geschwindigkeit : " << m_Geschwindigkeit << endl;
            cout << "Anzahl der Minen: " << m_AnzahlMinen << endl;
        }

};

// Hauptprogramm
//
int main ()
{
    // Variablen
    //
    cout << "Multimap-Flotte wird definiert" << endl; // IST NEU DAZU
    multimap<string, CMinenleger> Flotte;       // Multimap
    cout << "Multimap-iterator wird definiert" << endl; // IST NEU DAZU
    multimap<string, CMinenleger>::iterator i;  // Iterator
    cout << "Pair wird definiert" << endl; // IST NEU DAZU 
    pair<string, CMinenleger> Typ;              // Paar-Objekt
    cout << "CMinenleger wird definiert" << endl; // IST NEU DAZU
    CMinenleger Minenleger;                     // Minenleger-Instanz

    // "LowBudget" Minenleger erstellen und in die Map schieben
    Minenleger.m_Energie = 500;
    Minenleger.m_Geschwindigkeit = 300;
    Minenleger.m_AnzahlMinen = 10;

    Typ = make_pair ("LowBudget", Minenleger);
    Flotte.insert (Typ);

    cout << "LowBudget-Minenleger eingefuegt" << endl; // IST NEU DAZU

    // Zwei "Standard"-Minenleger erstellen und in die Map schieben
    Minenleger.m_Energie = 1000;
    Minenleger.m_Geschwindigkeit = 500;
    Minenleger.m_AnzahlMinen = 15;

    Typ = make_pair ("Standard", Minenleger);
    Flotte.insert (Typ);

    cout << "Standard-Minenleger eingefuegt" << endl; // IST NEU DAZU

    Typ = make_pair ("Standard", Minenleger);
    Flotte.insert (Typ);

    cout << "Standard-Minenleger eingefuegt" << endl; // IST NEU DAZU

    // "Hightech" Minenleger erstellen und in die Map schieben
    Minenleger.m_Energie = 2000;
    Minenleger.m_Geschwindigkeit = 800;
    Minenleger.m_AnzahlMinen = 30;

    Typ = make_pair ("Hightech", Minenleger);
    Flotte.insert (Typ);

    cout << "Hightech-Minenleger eingefuegt" << endl; // IST NEU DAZU

    // Bestandsaufnahme
    cout << "Flottenbestand:" << endl;

    cout << "Anzahl der Schiffe in der Flotte: ";
    cout << static_cast<int> (Flotte.size () );
    cout << endl;

    cout << "Anzahl der Minenleger des Typs \"LowBudget\": ";
    cout << static_cast<int> (Flotte.count ("LowBudget") );
    cout << endl;

    cout << "Anzahl der Minenleger des Typs \"Standard\": ";
    cout << static_cast<int> (Flotte.count ("Standard") );
    cout << endl;

    cout << "Anzahl der Minenleger des Typs \"Hightech\": ";
    cout << static_cast<int> (Flotte.count ("Hightech") );
    cout << endl;

    // Daten des "Hightech"-Minenlegers ausgeben
    i = Flotte.find ("Hightech");

    if (i != Flotte.end() )
    {
        // Wenn vorhanden, dann Daten ausgeben
        cout << "Typ \"Hightech\" vorhanden. Daten:" << endl;
        i->second.ZeigeDaten ();
    }
    else
    {
        // Wenn nicht vorhanden, Fehlermeldung ausgeben
        cout << "Typ \"Hightech\" nicht in der Flotte vorhanden";
        cout << endl;
    }
    return 0;
}


Die Ausgabe (fettgedruckte ist neu):

Zitat

Multimap-Flotte wird definiert
Multimap-iterator wird definiert
Pair wird definiert
Klasse "CMinenleger" wurde aufgerufen
CMinenleger wird definiert
Klasse "CMinenleger" wurde aufgerufen
LowBudget-Minenleger eingefuegt
Standard-Minenleger eingefuegt
Standard-Minenleger eingefuegt
Hightech-Minenleger eingefuegt

Flottenbestand:
Anzahl der Schiffe in der Flotte: 4
Anzahl der Minenleger des Typs "LowBudget": 1
Anzahl der Minenleger des Typs "Standard": 2
Anzahl der Minenleger des Typs "Hightech": 1
Typ "Hightech" vorhanden. Daten:
Energie : 2000
Geschwindigkeit : 800
Anzahl der Minen: 30

Ich habe nun erwartet, das die Klasse "CMinenleger" immer aufgerufen wird, sobald das Objekt in die Map eingefügt wird (da 4 Schiffe und damit auch 4 Instanzen).
Stattdessen wird die Klasse 2 mal am Scriptanfang aufgerufen.
Wie kann man sich das erklären?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Teiby« (23.11.2011, 21:09)


MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

2

23.11.2011, 23:01

Blödsinn... Sorry... Nochmal:
Du erzeugst am Anfang das Objekt. Dann übergibst Du dieses Objekt an die Map. Schau mal was passiert, wenn Du einen Kopierkonstruktor einbaust.

Teiby

Frischling

  • »Teiby« ist der Autor dieses Themas

Beiträge: 42

Beruf: Ausbildung

  • Private Nachricht senden

3

24.11.2011, 18:17

von einem Kopierkonaturktor wurde im Buch nie was erwähnt. Naja Google hilft mal weiter: http://de.wikipedia.org/wiki/Kopierkonstruktor
Nun sieht das ganze besser aus.

Die normale Klassen-Funktion wird aufgerufen wenn man einen Wert neu definiert oder wenn man "new" verwendet. Der Kopierkonstruktor immer wenn ein Wert gesetzt wird. Richtig?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Teiby« (24.11.2011, 18:30)


4

24.11.2011, 19:36

Der Kopierkonstruktor wird im Buch später noch behandelt, und zwar im Kapitel "Sonst noch was?".

Werbeanzeige