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

NukeNoob

Frischling

  • »NukeNoob« ist der Autor dieses Themas

Beiträge: 48

Beruf: Student

  • Private Nachricht senden

1

09.10.2012, 16:46

Probleme mit verketteten Listen

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?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NukeNoob« (09.10.2012, 16:57)


2

09.10.2012, 16:57

/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »E333« (02.09.2021, 04:07)


NukeNoob

Frischling

  • »NukeNoob« ist der Autor dieses Themas

Beiträge: 48

Beruf: Student

  • Private Nachricht senden

3

09.10.2012, 17:06

Der Iterator zeigt auf den Eintrag der Liste, dieser Eintrag kann eine Instanz einer Klasse sein (Ein "int" z.B. auch). In dem Fall zeigt er somit auf eine Instanz, was mir aber nicht weiterhilft, da er mir nur die Adresse im Speicher des Eintrags und nicht die Nummer des Eintrags in der Liste liefert. Was ich jetzt gemacht habe, ist quasi das manuelle Zählen der Einträge, bis der Iterator die Adresse des gewünschten Eintrags zurückliefert, und ich diesen per Zeiger verändern kann. Komisch finde ich, dass es dafür keine Funktion gibt, zumindst kenne ich diese nicht und in der MSDN finde ich auch nichts dazu.

LG
NukeNoob

Danke für die schnelle Antwort!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NukeNoob« (09.10.2012, 17:12)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

09.10.2012, 17:19

Wieso verwendest du nicht einfach einen std::vector, wenn du Zugriff per Index brauchst? Gibt es einen bestimmten Grund, wieso es eine std::list sein muss? Bei einer list gibt's nunmal keinen wahlfreien Zugriff, das ist doch gerade eine der Eigenschaften, die die list ausmachen...

NukeNoob

Frischling

  • »NukeNoob« ist der Autor dieses Themas

Beiträge: 48

Beruf: Student

  • Private Nachricht senden

5

09.10.2012, 17:32

Hallo dot!
Danke für deine Antwort. Ich konnte dem Buch nicht entnehmen, dass Vektoren auch Instanzen von Klassen aufnehmen können ... doof gelaufen. Habe gerade ein Testprogramm geschrieben und ein Vektor eignet sich tatsächlich perfekt für mein Problem. Ich hatte irgendwie in Erinnerung, dass Listen Vektoren in allen Punkten erweitern. Getäuscht hab ich mich!

LG
NukeNoob

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

09.10.2012, 17:34

Ich hatte irgendwie in Erinnerung, dass Listen Vektoren in allen Punkten erweitern. Getäuscht hab ich mich!

In der Tat, Listen und Vektoren sind zwei grundlegend verschiedene Dinge... ;)

NukeNoob

Frischling

  • »NukeNoob« ist der Autor dieses Themas

Beiträge: 48

Beruf: Student

  • Private Nachricht senden

7

09.10.2012, 17:35

Eine Frage, wie kann man das Thema als "[erledigt]" markieren?
Danke!

LG
NukeNoob

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

09.10.2012, 17:38

Du könntest einfach den Titel editieren. Ich muss gestehen, dass ich grad nicht ganz sicher bin wie; ich hab einfach ein Icon links neben dem Titel, das mir ein entsprechendes Menü liefert, aber ich weiß nicht, ob du das auch hast. In jedem Fall solltest du aber das Anfangsposting editieren können...

NukeNoob

Frischling

  • »NukeNoob« ist der Autor dieses Themas

Beiträge: 48

Beruf: Student

  • Private Nachricht senden

9

09.10.2012, 18:09

Hmm, ich wüsste nicht wo. Wo kann man den Titel bearbeiten?

LG!

NukeNoob

Frischling

  • »NukeNoob« ist der Autor dieses Themas

Beiträge: 48

Beruf: Student

  • Private Nachricht senden

10

09.10.2012, 18:49

Noch eine Frage hinterher, auch wenn man eigentlich nur eine Frage pro Thema stellen soll. Ist aber nah dran: Wenn ich nun einen Vektor mit

C-/C++-Quelltext

1
vVektor[Zahl] = 100;

ansteuern kann, muss es nun die Möglichkeit geben, die Stelle des Eintrags [Zahl] im Vektor auszulesen, d.h. jeder Eintrag im Vektor hat einen Index [Zahl].
Zusammenfassend: Ich möchte gerne in Abhängigkeit vom Iterator z.B: "i" den Index des Eintrages im Vektor auslesen, z.B. "vVektor.getIndex(*i);" und diese Funktion soll dann den Index als "int" zurückliefern (bzw. als Zahl). Hat Jemand eine Idee?

LG
NukeNoob

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NukeNoob« (09.10.2012, 19:26)


Werbeanzeige