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

TigerClaw25

unregistriert

11

17.07.2017, 12:05

Ich habe mir das Thema noch einmal durchgelesen. Ich versuche die Listen so zu nehmen, wie sie sind.

Eventuell kann ich kurz erläutern, wie ich das verstehe:

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
#include <iostream>
#include <list>
using namespace std;


class CRaumschiff{
private: 
    int m_ID;
public:
    CRaumschiff(int ID){
        m_ID = ID;
        cout << "Raumschiff erstellt! " << endl;
    }
    ~CRaumschiff(){cout << "Raumschiff zerstoert! " << endl;}

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

int main() {

    list<CRaumschiff*> lSchiffe;
    list<CRaumschiff*>::iterator i;

    int Anzahl = 0;

    CRaumschiff *Temp = nullptr;

    cout << "Wie viele Raumschiffe sollen erzeugt werden: " ;
    cin >> Anzahl;

    for (int j=0; j < Anzahl; j++){
        Temp = new CRaumschiff(j+1);
        lSchiffe.push_back(Temp);
    }
    
    system("Pause");
    return 0;
}


Das Beispiel ist nicht vollständig. Also, ich erstelle mir eine List. In den Klammern gebe ich den Datentyp der zu speichernden Elemente an. In dem Fall ein Zeiger auf Klassen-Instanzen. Da die Liste eben Zeiger enthält, reserviere ich mit "new CRaumschiff" speicher auf dem Heap. Temp zeigt auf das erste Klassenobjekt bzw. dessen Adresse. Diese Adresse schiebe ich über Temp in die Liste. Dann überschreibe ich Temp bzw. lasse Temp auf die Adresse des zweiten Klassenobjekts zeigen und schiebe diese erneut in die Liste. Über den Iterator kann ich dann auf alle Zeiger zugreifen. In dem Fall ist es ja egal, dass ich durch das Überschreiben von Temp die alten Adressen überschreibe, da diese ja in der Liste weiterhin exisieren.

Das ist das, was ich als Anfänger bisher verstanden habe.

Aber auch hier muss ich mich an manche Schreibweisen gewöhnen wie die Ausgabe über die Klassenfunktion:

C-/C++-Quelltext

1
2
3
for (i=lSchiffe.begin(); i!=lSchiffe.end(); i++){
        (*(*i)).Starten();
    }


In dem Fall liefert *i ja nur die Adresse, da die Elemente der Liste Zeiger sind. Daher doppelt deferenzieren. Aber es ist ist gewöhnungsbedürftig, wenn *i die Adresse liefert, was liefert dann ( i )?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (17.07.2017, 12:19)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

17.07.2017, 12:43

"( i )" liefert den Iterator.
Du hättest auch (*i)->Starten(); schreiben können.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TigerClaw25

unregistriert

13

17.07.2017, 16:04

Ich nutze Anfängertechniken ;)

Genau wie bei Maps und Multimaps. Kaliste verwendet "i = Punktetabelle.find("Name");", um nach dem Namen zu suchen. Da es sich bei mir eingeprägt hat, dass der Zugriff immer über den Iterator erfolgt und dafür die Anfangsadresse des Container-Feldes mitgeteilt werden sollte, schreibe ich

C-/C++-Quelltext

1
2
i = Punktetabelle.begin();
i->first.find("Name");


Im Falle von find() wird zwar ein Iterator geliefert, aber das verwirrt mich etwas. Hatte mir Programmieren einfacher vorgestellt.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

17.07.2017, 16:35

Nun, bei Java hättest du bei einem find() direkt das Element bekommen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TigerClaw25

unregistriert

15

17.07.2017, 16:44

Wobei mein Beispiel falsch ist. Über den Iterator erhalte ich stets das letzte Element.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

17.07.2017, 16:49

Über einen Iterator erhältst du *ein* Element. Das kann das erste, das letzte oder eins mittendrin sein.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

17

17.07.2017, 19:07

Ich glaube für dich wäre eine gute Übung selber mal eine Verkettete Liste zu programmieren.
1. wird dir das Konzept dahinter klarer
2. arbeitest du mit Pointern und verinnerlichst diese Konzepte noch weiter.

Vielleicht erstmal die Methoden Add(), next(), prev() und clear().
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

TigerClaw25

unregistriert

18

17.07.2017, 20:16

Ich habe mit dem Programmcode etwas experimentiert. Jetzt denke ich, dass ich es verstanden habe.

C-/C++-Quelltext

1
2
i = Punktetabelle.begin(); 
i->first.find("Name");


Das kann garnicht funktionieren, da der Iterator auf das erste bzw. zuletzt eingefügte Element zeigt. Das wird dann stets ausgegeben. find() hat somit keinerlei Wirkung. Anders verhält es sich, wenn ich direkt "Punktetabelle.find();" aufrufe. Dann erhalte ich zwar auch einen Iterator, aber den, der auf das entsprechende Feld zeigt.

Jetzt hats Klick gemacht ;)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

19

17.07.2017, 20:22

Genau. Und ist dieser Iterator den du zurück bekommst gleich Punktetabelle.end() dann wurde nichts gefunden. Das erklärt sich dadurch dass end() dir einen Iterator zurück gibt welcher hinter das letzte Element zeigt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige