Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » vector of pointer und new

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 < [ 2 ]
000
03.02.2004, 09:54 Uhr
~Davood
Gast


Liebe Freunde!

ich habe einen Vector von einem Pointer vom Typ einer Oberklasse. Jetzt möchte ich den Typ mit Hilfe von new zur Unterklasse ändern. Geht's so etwas?

Ein kleines Beispiel:


C++:
#include <vector>
using std::vector;

class Machine
{
public:
    Machine()
    {
        wheels = 4;
    }
    int wheels;
};

class Car : public Machine
{
public:
    Car(){}
    char name[10];
};

main()
{
    vector<Machine> *myMachine;
}


wie can ich myMachine von Typ Car machen. So etwas geht z. B.:

Machine *myMachine;
myMachine = new Car;

aber wie ist es mit vector???

Danke Euch für die Hilfe

Grüsse
Davood

Bearbeitung von by virtual:
C P P Tag eingefügt

Dieser Post wurde am 03.02.2004 um 10:30 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.02.2004, 10:32 Uhr
(un)wissender
Niveauwart


Du darfst einen Vector niemals polymorph behandelt!
Das einzige was du machen kannst ist, pointer auf Machine im Vector zu haben, und dann mit new Cars und Machines hinzufügen.
Allerdings musst du dann aufpassen, das du, wenn du im vector löscht, bspw. durch erase, den Pointer vorher löscht.

Ach ja, Machine braucht unbedigt einen virtuellen Destruktor!
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.02.2004, 10:36 Uhr
virtual
Sexiest Bit alive
(Operator)


Das geht nur, wenn Du in den vector selbst Pointer reintust:

C++:
vector<Machine*> myMachine;
myMachine.push_back(new Car(...));
std::cout<<myMachine[i]->name<<std::endl;


Der Große Nachteil ist, daß man dann aber die Vektorelemente selbst deleten muß (sind ja mit new angelegt). In verbindung mit SmartPointern kann man das aber auch vereinfachen:

C++:
vector<smart_ptr<Machine> > myMachine;
myMachine.push_back(new Car(...));


Läßt sich zwar genau wie oben anwenden, aber man ist der Speicherverwaltung entledigt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 03.02.2004 um 10:38 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.02.2004, 10:44 Uhr
(un)wissender
Niveauwart


Zwei Lebewesen, ein Gedanke!
Das mit den smart_pointern ist ein guter Tipp!
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.02.2004, 10:51 Uhr
RHBaum




Zitat:

In verbindung mit SmartPointern kann man das aber auch vereinfachen:


Dafuer ist es aber ne Kunst, den richtigen Smartpointer zu finden :p

Hinweis:
auto_ptr<> ist so hat nen grundlegendes Element so gebaut, das es bei ner benutztung im container knallt. Und das ist so gewollt !!!

Es gibt aber irgendwie nen Adapter zum auto_ptr, wo man den in nen container reinbekommt ....

Besser sind ref gezaehlte Smartpointer. Die haben aber andere Probleme ... und da wirst keinen in der STL finden, also musst auf ne andere lib ausweichen (boost z.b)

So einfach isses eben nu halt auch wieder nich !

Willst den ganzen Aerger dir ersparen ... Kapsel deinen Vector in ne eigene klasse, geh davon aus, dass nur mit new erzeugte elemente reinwerfen kannst, und dann loesch die elemente selber ausm container, bevor er ungueltig wird ....

Ciao ....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
03.02.2004, 10:55 Uhr
(un)wissender
Niveauwart


Ach, zur Not nimmste deinen eigenen smart_pointer.
Schau mal in FAQ, da hat virtual einem gemacht.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.02.2004, 11:02 Uhr
RHBaum



Ja schon, fuer die meisten anwendungen reicht der locker :-)
Aber auch der hat probleme, an bestimmten stellen.
Und es gibt halt ned den generischen Pointer, den man fuer alles benutzen kann. Sonst waere in der STL bestimmt auch einer zu finden !

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.02.2004, 11:06 Uhr
(un)wissender
Niveauwart


Wenn man möchte kann man hier endlos Ärger machen: const, Vererbung, Sicherheit, ...
Aber was ist schon perfekt?
Wie du schon sagtest, hier reicht der locker.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
03.02.2004, 11:23 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
RHBaum postete
[quote]
In verbindung mit SmartPointern kann man das aber auch vereinfachen:


Dafuer ist es aber ne Kunst, den richtigen Smartpointer zu finden :p
[/quote]
Siehst Du, und deshalb habe ich ja auch direkt den richtigen rausgesucht
--
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
009
03.02.2004, 12:50 Uhr
RHBaum




Zitat:

Aber was ist schon perfekt?


Darum gings mir nich ....
Wenn ich mich naiv anstelle, nach dem lesen eurer Posts, folge eurem link, lese als erstes auto_ptr<> !
Erste Erkenntnis: vector<auto_ptr<MyClass> >.
Ergebniss: compiler error!
weitere Schritte: Den Thread auf das der link zeigt, gründlicher lesen und sich mit Anforderungen der container und verhalten des auto_ptr auseinandersetzen.
Erkenntis: auto_ptr ist ned wirklich nen "Smartpointer" weil er sich ned wirklich "smart" verhaelt Pointer lassen sich kopieren und sind danach noch gueltig !!!
weitere Erkenntnis: ich brauch nen richtigen Smartpointer! und die STL hat keinen !
moegliche wege:
1. ich vertraue virtual !
2. ich bekomm boost bei mir zu laufen
3. ich krieg einen aus ner anderen lib
4. ich schreib selber einen
5. ich lass die finger von smartpointer, und nehm "richtige" zeiger.

Und jetzt sagst du, es ist doch so einfach !
Naja, ehrlich gesagt, das wirkliche problem ist das die STL keinen "anderen" Smartpointer hat (was auch seine Gruende hat). Und ned jeder hat lust, sich wegen so ner bloeden Containerklasse 25000 Abhandlungen uber c++ design zu lesen. Naja, frueher oder spaeter wird er es machen muessen, wenn er sich weiter mit c++ beschaeftigt. Aber in dem Stadium ...
Versteh mich ned falsch, ich bin natuerlich nicht gegen "smartpointer", aber frueher oder spaeter faellt man damit auf die Nase, wenn man sie "blind" benutzt. Wenn man versteht, ists ne super Sache. Also vorher sollt man sich schon mit ExceptionsSicherheit, Exeptionneutralitaet etc. auseinandersetzen, schon allein, um die "wirklichen" Vorteile von smartpointer zu begreifen :-)


Zitat:

Siehst Du, und deshalb habe ich ja auch direkt den richtigen rausgesucht


Naturgemaess bin ich halt skeptisch, wenn andere Leute / Firmen fuer mich das richtige raussuchen ! Ok, das hat auch was mit Paranoia zu tun ... aber die sollte jeder Programmierer haben.

Ciao ....

Dieser Post wurde am 03.02.2004 um 13:06 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: