Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Kontainer von abgeleiteten Klassen

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
01.09.2003, 14:14 Uhr
Tiffi



Hallo,
ich habe ein kleines Problem mit abgeleiteten Klassen und Kontainern (vector).
Ich habe verschiedene Elemente (4-Ecke, 3-Ecke, Linien, etc) und will für diese eine Basisklasse (ELEM) definieren. Für alle Elemente will ich zum Beispiel eine Funktion definieren, die mir die Zahl der Ecken zurückgibt. Also

C++:
class ELEM {
double ecken(){return 0}; //Standartwert
...};


Davon leite ich dann Klassen für die speziellen Elemente ab (QUAD, TRI,...). Also zum Beispiel

C++:
class QUAD:public ELEM{
double ecken(){return 4};
...};



Dann will ich alle Elemente (i.A. unterschiedliche Elemente), die ich während einer Berechnung benutze, in einem Kontainer zusammenfassen. Also

C++:
vector<ELEM> elemente;


Wenn ich jetzt auf die Funktion ecken() eines Elements im Kontainer zugreife, erhalte ich als Rückgabe immer den Standartwert (0) und nicht den richtigen Wert (bei QUAD 4). Eine abstrakte Klasse für ELEM ist auch nicht möglich, da ich ja dann mit ELEM keinen vector mehr bilden kann.
Kann mir jemand einen Tipp geben?
Grüßle
Tiffi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.09.2003, 14:17 Uhr
typecast
aka loddab
(Operator)


Versuch mal die Funktion ecken als virtual zu deklarieren
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.09.2003, 14:27 Uhr
virtual
Sexiest Bit alive
(Operator)


Das liegt daran, daß im Vector auch wirklich nur ELEM Klassen zu finden sind:

C++:
std::vector<ELEM> elemente;
QUAD q;
elemente.push_back(q);


Du gehst vermutlich davon aus, daß in der letzten Zeile das q in den Vector eingefügt wird. Was aber tatsächlich geschieht ist, daß eine Kopie erzeugt wird, und zwar wird der Copy-Constructor von ELEM aufgerufen. Dieser Copyconstructor wird aber nur den ELEM Anteil eines QUAD in den Vector kopierten.
Letztlich kannst Du Dein Probelm nur dadurch umgehen, daß Du einen Vector bestehend aus ELEM* machst:

C++:
std::vector<ELEM*> elemente


Das hat aber gleich mehrere Konsequenzen:
1. Du kannst nur noch pointer einfügen; insbes. darfst Du keine Pointer auf lokale Variablen einfügen. Dh in letzter Konsequenz, daß Du die Elemente fortan mit new anlegen mußt:

C++:
std::vector<ELEM*> elemente
elemente-push_back(new QUAD(...));
...


2. Du musst selbst dafür sorgern, daß die Elemente wieder friegebene werden:

C++:
...
for(i=0; i<elemente.size(); ++i) delete elemente[i];
elemente.clear();


Außerdem - völlkig losgelöst von dieser Problematik mußt Du in ELEM die ecken Methode virtuell machen.

Letztlich bekommt man das Vektorproblem am elegansten jedoch durch die Verwendung von Smart-Pointern in den griff, die jedoch nicht Bestandteil des Standards sind:

C++:
std::vector<SmartPtr<ELEM> > elemente;


Du kanst Dann eigentlich wie ursprünglich geplant mit dem Vector arbeiten - ohne Aufräumarbeiten per Hand, ohne new; allerdings mußt Du dann eben -> an Stelle von . beim Zugriff der Elemente verwenden:

C++:
elemente[0]->ecken();


--
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
003
01.09.2003, 15:44 Uhr
Tiffi



Danke für die Hilfe erstmal!

Zitat:
virtual postete
...
Außerdem - völlig losgelöst von dieser Problematik mußt Du in ELEM die ecken Methode virtuell machen.


Das ist klar - hab ich nur beim Tippen vergessen.

Zitat:

Letztlich bekommt man das Vektorproblem am elegansten jedoch durch die Verwendung von Smart-Pointern in den griff, die jedoch nicht Bestandteil des Standards sind:

C++:
std::vector<SmartPtr<ELEM> > elemente;




Das klingt auch nicht schlecht. Muss ich da noch irgendwelche Header einbinden oder was heißt ist nicht Bestandteil des Standarts?
Grüßle
Tiffi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.09.2003, 16:10 Uhr
virtual
Sexiest Bit alive
(Operator)


Du mußt Dir entweder selbst einen Smartpointer bauen (nicht empfehlenswert) oder aber einen aus dem Netz ziehen (empfehlenswert: www.boost.org)
Nicht im Standard bedeutet sowviel wie: Wird nicht zwingend bei Deinem Compiler dabei sein. Bei meinen zB gibt es keien Smartpointer, deshalb hab ich sie mir selbst gebaut (bin erst später auf die Boostseite gekommen)
--
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
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: