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

Yoshi

Frischling

  • »Yoshi« ist der Autor dieses Themas

Beiträge: 61

Beruf: Schüler

  • Private Nachricht senden

1

29.03.2006, 17:38

Virtuelle Funktionen

Hallo!

Ich habe ein Problem mit einer Virtuellen Funktion. Ich wollte das Beispiel aus dem Buch um Eine Waffe erweitern und habe folgende Klassen:

CWeapon
CShot
CDoubleShot

CShot und CDoubleShot sind von CWeapon abgeleitet. Die einzige Funktion die überschrieben wird ist Update().
Wenn ich die Update() Funktion in der Klasse Weapon virtuell mache sollte bei dem Aufruf die Update() Funktion die Funktion in einer der Unterklassen aufgerufen werden oder hab ich da etwas falsch verstanden?

*EDIT: Ich programmiere auch in java und da würde sowas ja mit abstract gemacht werden.... Ist virtuell das Gleiche wie abstract?

Yoshi

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

2

29.03.2006, 18:31

Jo sollte sie, aber wo ist das Problem?

Yoshi

Frischling

  • »Yoshi« ist der Autor dieses Themas

Beiträge: 61

Beruf: Schüler

  • Private Nachricht senden

3

29.03.2006, 19:38

Oh tut mir leid habs wohl ganz vergessen *g*

Also im Programm ist ja schon eine Liste mit den Schüssen. In diese Liste werden bei mir die CShot und CDoubleShot Objekte gelegt. Dann wird diese Liste immer durchlaufen und von jedem Schuss wird Update() und Render() aufgerufen. Render ist kein Problem weil dafür sowiso die Basisklasse verantwortlich ist aber Update() SOLLTE eigentlich von eine der Unterklassen aufgerufen werden.


Hier ein Code Ausschnitt in dem die Methode aufgerufen wird

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
  // Iterator für Schussliste

  list<CWeapon>::iterator it = m_ShotList.begin ();

  // Schussliste durchlaufen

  while (it != m_ShotList.end ())
  {
    // Schuss updaten

    it->Update ();

    // Ist der Schuss noch aktiv?

    if (it->IsAlive ())
    {
      // Ja, dann rendern

      it->Render ();
      it++;
    }
    else
    {
      // Nein, dann aus der Liste entfernen

      it = m_ShotList.erase (it);
    }

  }


Yoshi

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

29.03.2006, 20:02

Statt

list<CShot>

solltest Du

list<CShot*>

verwenden.
Es ist nämlich wesentlich praktischer und auch viel schneller, mit Zeigern auf Objekte zu arbeiten statt mit den Objekten selbst. Dann sollte sich auch Dein Problem lösen (vorausgesetzt Du hast die Update-Methode in der Basisklasse als virtual deklariert).

Yoshi

Frischling

  • »Yoshi« ist der Autor dieses Themas

Beiträge: 61

Beruf: Schüler

  • Private Nachricht senden

5

30.03.2006, 22:00

Hallo

Tut mir leid das ich jetzt noch einmal nachfragen muss, aber ich komm irgendwie zu keiner Lösung.
Ich hab mit Java angefangen und steh noch nicht so gut mit den Zeigern und das Ganze ist mir noch ein wenig unklar.
Wenn ich in die Liste Zeiger lege und keine Objekte ist mir klar das ich noch andere Teile des Programmes ändern muss. Nur weiß ich nicht was ich mit den Iteratoren machen soll.
Duch mehrfaches lesen des Zeiger Kapitels im Buch bin ich auch nicht wirklich weiter gekommen.

Yoshi

Werbeanzeige