Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » dynamisches Casten(?) aus einer std::list

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.09.2003, 02:02 Uhr
~Horni
Gast


Hi.
ich hoffe mir kann jemand helfen und zwar habe ich eine Liste bzw. darauf einen iterator mit Objekten einer Basis-Klasse. In der Liste sind dann viele verschiedene Objekte zu den jeweiligen Klassenimplementationen dieser Basisklasse. Ich möchte dann an einigen Stellen auf verschiedene Funktionen der Klasse zugreifen, die nur in der abgeleiteten vorhanden sind. Aber eben immer verschiedene, je nach Objekt... ich hatte daran gedacht dieses dann einfach in ein Objekt der abgeleiteten Klasse zu Casten, aber das habe ich nicht hinbekommen.

Kann mir jemand in der Richtung weiterhelfen?? Danke.....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.09.2003, 08:27 Uhr
virtual
Sexiest Bit alive
(Operator)


Du meinst, Du hast folgendes?

C++:
class A { };
class B: public A {
void b_methode(); };
...
std::list<A> liste;
...
std::list<A>::iterator i = ....;

i->b_methode();



Das würde in dieser Form schonmal gar nicht gehen, weil liste wirklich nur A Instanzen hält, auch wenn du B Instanzen reingetan hast. Beim Einfügen wird nämlich der Kopie-Constructor von A benutzt, nicht tewa der von B.
Folglich müsse Deine Liste eine Liste von Piointer sein:

C++:
std::list<A*> liste;
liste.push_pack(new B);
...
std::list<A*>::iterator i = ....;


Nun musst Du beim Aufräumen der liste jedoch die Elemente Freigeben. Für Den Zugriff auf die B-Methode müsstest du dann den Dynamic-Cast bemühen (Ableiten impliziert einen virtuelle dtor in den meisten Fällen und damit eine VMT, so daß ein dynamic_cast auch tut):

C++:
B* b = dynamic_cast<B*>(*i);
if (NULL != b)
{
    b->b_method();
}else
{
   /* Iterator zeigt auf kein B */
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.09.2003, 09:24 Uhr
~(un)wissender
Gast


@Horni
Du kannst dynamische Features (wie Poymorphie etc.) auch nur mit dynamisch allokierten Objecten nutzen, will heißen mit new...
Der Grund ist schlich und einfach, das bei Stack bzw. statischen Objecten die Speicherbedarf zur Compilezeit feststeht und auch nicht mehr geändert werden kann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.09.2003, 09:58 Uhr
virtual
Sexiest Bit alive
(Operator)


@unwissender:
nee, so stimmt das nicht:

C++:
#include <iostream>
class A
{
public: virtual void f() { std::cout<<"A::f()"<<std::endl; };
};

class B: public A
{
public: virtual void f() { std::cout<<"B::f()"<<std::endl; };
};

void g(A& a)
{
   a.f();
}

int main()
{
   B b;
   A a;
   g(a);
   g(b);
}


Das dürfte nach Deiner Theorie nicht die Ausgabe machen, die es nun mal macht. Polymorphie kannst du auch ohne new nutzen. Der Grund ist wirklich einfach nur, daß die STL Container ganz stupide ihre Elemente Kopieren Und wenn Du sagst, du hast einen A-Container, wird auch immer nur der A-Antail eines Objekts kopiert, egal, ob wirklich ein A oder ein Objekt einer abgeleiteten Klasse reingestopft wurde.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.09.2003, 11:23 Uhr
~(un)wissender
Gast


Gut, eingesehen, war wohl etwas voreilig bzw. unpräzise!
Der Trick an der Sache ist halt, dass Container nie polymorph mit Objecten, sondern nur mit Pointern, genutzt werden können.
Eben weil der Speicherplatz (der einzelnen Elemente )festgelegt ist und normalerweise nicht erweiter wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.09.2003, 09:45 Uhr
~Horni
Gast


Danke! Ich habs hinbekommen....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: