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

Freienstein

Frischling

  • »Freienstein« ist der Autor dieses Themas

Beiträge: 84

Wohnort: Berlin

  • Private Nachricht senden

11

29.07.2011, 18:59

Aber wie ruf ich die auf? Das will bei mir einfach nicht funktionieren?

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

12

29.07.2011, 19:05

http://www.cplusplus.com/doc/tutorial/polymorphism/
Das erstbeste was Google asugespuckt hat.
Suchwort: "polymorphism C++" oder "virtual functions c++"
Signaturen werden überbewertet

Freienstein

Frischling

  • »Freienstein« ist der Autor dieses Themas

Beiträge: 84

Wohnort: Berlin

  • Private Nachricht senden

13

30.07.2011, 13:15

Ich glaub wir reden hier grad aneinander vorbei, da ich nicht genau beschrieben habe, was ich meine. Nehmen wir mal an das:

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
class Einheiten
{
  protected:
  int Variable;

  public:
  Einheiten ();
  void Funktion ();
};

class Soldat : public Einheiten
{
  public:
  Soldat ();
};

int main ()
{
  Einheiten *pZeiger;
  pZeiger = new Soldat;

  pZeiger->Funktion ();
}


So kann ich die Funktion problemlos aufrufen. Wenn ich jetzt allerdings mit std::list und push_back einen neuen Soldaten erschaffe, habe ich keinen blassen Schimmer.

14

30.07.2011, 13:47

Du brauchst ein Listenelement vom Typ "Soldat".

C-/C++-Quelltext

1
list<Soldat> m_SoldatListenElement;

Mit diesem kannst du dann deine Soldaten einordnen:

C-/C++-Quelltext

1
m_SoldatListenElement.push_back(SoldatInsanzZumErstellen);


MfG
Check

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

15

30.07.2011, 14:30

Wenn du für alle Einheiten in der Liste eine Aktion durchführen willst geht das wie beim Freigeben des Speichers:

C-/C++-Quelltext

1
2
3
for (std::list<Einheit*>::iterator i = einheiten.begin(); i != einheiten.end(); ++i)
    (*i) // "dereferenzieren" des Iterators => der gespeicherte Wert (in diesem Fall ein Zeiger auf "Einheit"
    ->Funktion(); // Aufrufen von Funktion() von dem Objekt auf das der Zeiger an dieser Position der Liste verweist


Wenn du eine bestimmte Einheit in der Liste identifizieren willst musst du einen Namen, eine ID oder sonst irgendwas speichern (als Element der Basisklasse "Einheit") und die Liste durchlaufen bis du beim gewünschten Element bist.

Wenn es sehr oft vorkommt, dass du eine bestimmte Einheit finden musst (d.h. mehrmals pro Frame) solltest du statt der std::list eine std::map<IDType, Einheit*> verwenden (IDType ist der Typ den du zum Speichern der ID, des Namens, oder was auch immer du zu Identifikation benutzt, verwendest; also z.B. int)
Dann kannst du auf ein bestimmtes Element so zugreifen: einheiten[id]->Funktion();

Du könnstest auch einen std::vector verwenden. Der Verhält sich vom Prinzip her wie ein Array, das Einfügen neuer Elemente ist allerdings langsam und um eine bestimmte Einheit zu finden müsstest du vmtl. trotzdem den ganzen std::vector durchlaufen.
Das ist also eig. nur sinnvoll wenn so gut wie nie Einheiten hinzukommen / entfernt werden...

Ich empfehle dir mal dieses Buch (oder die deutsche Übersetzung falls Englisch ein großes Problem darstellt): [amazon]0201700735[/amazon]
Signaturen werden überbewertet

jokester

Treue Seele

Beiträge: 125

Wohnort: Mainz

  • Private Nachricht senden

16

30.07.2011, 14:38

das Einfügen neuer Elemente ist allerdings langsam

Ergänzung: das Einfügen neuer Elemente in der Mitte oder am Anfang ist langsam. push_back ist amortisiert O(1). (Weil auch idR doppelt so viel Speicher wie benötigt angefordert wird muss der vector z.b. bei 1 Mio push_backs nur 20 mal intern umkopieren.)
"There is a theory which states that if ever anyone discovers exactly what the Universe is for and why it is here, it will instantly disappear and be replaced by something even more bizarre and inexplicable. There is another theory which states that this has already happened" -- Douglas Adams.

Freienstein

Frischling

  • »Freienstein« ist der Autor dieses Themas

Beiträge: 84

Wohnort: Berlin

  • Private Nachricht senden

17

30.07.2011, 14:45

Ein Buch hab ich ja und zwar das von Heiko Kalista (zweite Auflage). Die Klassen sind Kapitel 7 und Kapitel 9 ist ... die STL mit Vektoren, Listen usw ... :S

Ich geh in der Zeit mal schnell ne neue Programmiersprache entwickeln mit void und hart als Datentypen für Variablen ...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Freienstein
{
  public:
  Freienstein ();
  void Kopf;  // ja VOID
};

class Wand
{
  public:
  Wand ()
  hart Wand;
};

int main ()
{
 Freienstein: Kopf->Wand;
 return Schmerz;
}


Aber trotzdem Danke an alle.

Werbeanzeige