Hallo @ all!
Ich habe wieder ein Problem mit den verketteten Listen. Für ein von mir geschriebenes Programm ist es wichtig, dass ich zur Laufzeit eine beliebige Anzahl von Instanzen einer Klasse erstellen kann und diese dann indizieren kann. Ich habe das ganze mit den verketteten Listen versucht, da ich dachte, dass der "Iterator" diese Funktion des indizierens übernimmt. Leider ist dem (bei mir) bis jetzt nicht so. Dazu der Beispielcode in leicht veränderter Version aus dem Buch:
|
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
|
#include <iostream>
#include <list>
#include <cstdlib>
#include <string>
using namespace std;
class CRaumschiff
{
public:
void setName()
{
cout << "Bitte Namen eingeben: ";
cin >> this->Name;
}
CRaumschiff (int ID)
{
m_ID = ID;
cout << "Raumschiff erstellt\n";
}
private:
int m_ID;
string Name;
};
int main (void)
{
list<CRaumschiff*> lSchiffe;
list<CRaumschiff*>::iterator i;
int Anzahl = 0;
CRaumschiff *Temp = NULL;
cout << "Wieviele Raumschiffe erstellen: ";
cin >> Anzahl;
for (int j=0; j<Anzahl; j++)
{
Temp = new CRaumschiff (j+1);
lSchiffe.push_back (Temp);
}
// Namen eingeben (bis jetzt nur so moeglich)
for (i=lSchiffe.begin(); i!=lSchiffe.end(); ++i)
{
(*i)->setName();
}
system("PAUSE");
}
|
Nun kann ich beliebig viele Raumschiffe erstellen und Jedem Raumschiff danach einen Namen geben. Schon klar, ein paar Stilbrüche sind dabei und normalerweise würde ich auchnoch Einiges anders machen, ist jetzt aber unwichtig. Gehen wir mal davon aus, ich möchte gerne NUR den Namen des 3. Raumschiffes ändern. So wie ich das sehe, wäre das nur so möglich:
|
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
|
#include <iostream>
#include <list>
#include <cstdlib>
#include <string>
using namespace std;
class CRaumschiff
{
public:
void setName()
{
cout << "Bitte Namen eingeben: ";
cin >> this->Name;
}
CRaumschiff (int ID)
{
m_ID = ID;
cout << "Raumschiff erstellt\n";
}
private:
int m_ID;
string Name;
};
int main (void)
{
list<CRaumschiff*> lSchiffe;
list<CRaumschiff*>::iterator i;
int Anzahl = 0;
int Eingabe = 0;
int tmp = 0;
CRaumschiff *Temp = NULL;
cout << "Wieviele Raumschiffe erstellen: ";
cin >> Anzahl;
for (int j=0; j<Anzahl; j++)
{
Temp = new CRaumschiff (j+1);
lSchiffe.push_back (Temp);
}
cout << "Namen von welchem Raumschiff ändern: ";
cin >> Eingabe;
// Namen eingeben (bis jetzt nur so moeglich)
for (i=lSchiffe.begin(); i!=lSchiffe.end(); ++i)
{
if (tmp == Eingabe)
{
(*i)->setName();
}
tmp++;
}
system("PAUSE");
}
|
In diesem Beispiel ist das noch recht übersichtlich, aber wenn man viele verschiedene Variablen womöglich auchnoch von Instanz zu Instanz unterschiedlich initialisieren will, braucht man schon ein "tmp-Array" mit 50 einträgen und dadurch wird der Code sehr unübersichtlich. Ich habe schon versucht, eine Instanz in der Liste anders anzusprechen, z.B. durch den "Iterator", aber da dieser nur als Zeiger auf den Eintrag in der Liste fungiert, kann ich nicht rausbekommen, welchen Eintrag er gerade repräsentiert.
Nun zu meinem Problem/ meiner Frage: Gibt es eine Möglichkeit, Instanzen von Klassen zu indizieren, sodass ich diese während der Laufzeit per Index ansprechen kann, ohne auf die Funktionen von Vektoren/Listen/Maps verzichten zu müssen?
LG
NukeNoob
Edit: Moment mal, kann man Instanzen von Klassen auch in Vektoren schieben?