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):
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?