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

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

1

15.08.2007, 21:22

Polymorphie in C++

Also z.B haben wir eine Klasse Tier, eine Klasse Wolf und eine Klasse Maus. Wolf hat "Fellfarbe" als Instanzvariable, Maus hat keine zusätzlichen, Wolf und Maus sind von Tier abgeleitet.

Quellcode

1
Tier* aTiere = new Tier[10]


Der Zeiger aTiere zeigt jetzt auf einen Speicherbereich, der 10x so groß is wie sizeof(Tier) - Oder?. Aber angenommen ich mache jetzt folgendes:

Quellcode

1
aTiere[3] = Wolf();


Dann haben wir ein Problem, oder?^^ Meine Frage ist genaugenommen: Ist Polymorhie in C++ also in dieser Hinsicht eingeschränkt, oder tue ich mir das Problem "einbilden"? 8)
PS. Mir ist klar, dass man auch einfach ein Array von Zeigern verwenden könnte, wozu ich keine Bedenken hätte.

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

2

15.08.2007, 21:43

Re: Polymorphie in C++

Quellcode

1
Tier* aTiere = new Tier[10]


oder

Quellcode

1
Tier** aTiere = new Tier[10]
?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

15.08.2007, 21:44

@the[V]oid:
Was du da in deinem Code machst, geht gar nicht.
Du musst es mit Zeigern machen.

@ChrisJ:
Tier** tiere = new Tier*[10];

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

4

15.08.2007, 23:10

Es geht schon - nur dass der wolfspezifische Teil vom Wolf abgeschnitten wird. Sprich, übrig bleibt ein Tier dass über den Wolfkonstruktor aufgebaut wurde aber nur die Tiervariablen enthält.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

16.08.2007, 09:13

Man nutzt in C++ std::vector!

C-/C++-Quelltext

1
2
3
4
std::vector< Tier* > foo;

foo.push_back( new Maus );
foo.push_back( new Wolf );


Am Ende natürlich nicht vergessen den Speicher wieder freizugeben Oder aber du nutzt Smartpointer (z.B. tr1::shared_ptr).
@D13_Dreinig

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

6

16.08.2007, 10:57

Geht auch eine array von zeigern ?
z.B.:

Quellcode

1
2
3
4
5
Tier*[10];

und dann ...

Tier[0] = new Wolf();

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

16.08.2007, 11:18

Ja geht, aber wie gesagt... in C++ verwendet man std::vector statt Arrays!
@D13_Dreinig

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

8

16.08.2007, 11:54

Hmmm

Ich dachte das die langsamer sind
weil er muss ja immer erst alle listenelemente
durchgehen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

16.08.2007, 12:50

Bei was geht er alle Listenelemente durch? Und std::vector ist genauso schnell wie normale Arrays. Nur kann das Template viel mehr!
@D13_Dreinig

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

10

16.08.2007, 13:28

War das net so das jedes listenElement einen *Zeiger auf
das nächste/(vorrige) Element hat und wenn man dann ein Element
haben möchte muss erst die ganze liste durchgegangen werden?

Werbeanzeige