Klasseninstanzen an vector Liste anfügen
-
Ich schreibe an einer Klasse die Geräte verwalten soll. Da es mehrere dieser Geräte an einem Controller geben kann schreibe ich eine Klasse für das Gerät und eine für den Kontroller.
Zugreifen möchte ich dann quasi per
Positioniereinheit.Verschiebetische[1].tuewas Positioniereinheit.Verschiebetische[2].tuewasDazu habe ich in der Klasse Positioniereinheit
folgenden Code:vector<PI_TranslationStage> Verschiebetische; int Positioniereinheit::AddTranslationStage() { PI_TranslationStage * newStage = new PI_TranslationStage; TranslationStage.push_back(newStage); }das funktioniert aber nicht. Ich wüsste auch nicht wo ich die Variablen wieder 'deleten' sollte.
error C2664: 'std::vector<_Ty>::push_back': Konvertierung des Parameters 1 von 'PI_TranslationStage *' in 'const PI_TranslationStage &' nicht möglich
Wie mache ich das dann stattdessen?
Matthias
-
Lass mal das new weg - in dem vector hast (und brauchst) du doch gar keine Zeiger:
int Positioniereinheit::AddTranslationStage() { TranslationStage.push_back(PI_TranlationStage());//packe ein default-initialisiertes Objekt in den vector<> return 0;//wenn die Funktion als int definiert ist, sollte sie auch etwas zurückgeben }oder
int Positioniereinheit::AddTranslationStage() { PI_TranslationStage newStage; TranslationStage.push_back(newStage); return 0; }
-
ich glaub der vector kann keine direkten pointer so verwalten, da es ja wie du selber merkst unklar ist wann das objekt zerstoert wird
nimm am besten direkt eine instanz ohne new
-
Mr Evil schrieb:
ich glaub der vector kann keine direkten pointer so verwalten, da es ja wie du selber merkst unklar ist wann das objekt zerstoert wird
Klar kann er das, wenn du es ihm sagst - er überlässt es nur komplett deiner Verantwortung, wann der Heap wieder freigegeben wird (sprich - du müßtest manuell für alle Elemente delete aufrufen, bevor sie aus dem vector geworfen werden).
-
aah, gut zu wissen {=
wenn dann lieber std::auto_ptr in nem vector schmeissen, wenns schon allokiert werden soll #ggstd::map<std::vector<std::auto_ptr<wchar_t>>, int> fasel;
sieht gut aus #gg
-
Mr Evil schrieb:
wenn dann lieber std::auto_ptr in nem vector schmeissen, wenns schon allokiert werden soll #gg
auto_ptr<> kannst du nicht in STL-Container packen (Copy-Ctor und operator= erfüllen nicht die Anforderungen an Container-Elemente), aber die Richtung stimmt schon
Im Zweifelsfall würde ich einen boost::shared_ptr<> verwenden.
-
Im zweifels fall würde ich std::tr1::shared_ptr benutzen. Habt ihr immer noch kein TR1 auf eurer Platte?

-
Artchi: Wo gibt es denn (außer für den gcc) die TR1-Header Files (z.B. für den MSVC++ oder Borland C++)?
Und zwar nachträglich, ohne daß ich die neueste Version kaufen muß...
-
Bei Boost ist es dabei! Wenn man sowieso schon Boost-sonstwas empfehlt, kann man auch gleich std::tr1-sonstwas empfehlen. Auch wenn Boost.TR1 nicht komplett ist, aber das meist genutzte ist dabei.
http://www.boost.org/doc/html/boost_tr1.htmlApaches Standardlib soll angeblich auch TR1 haben... habs aber nicht nachgeprüft:
http://incubator.apache.org/stdcxx/Für MSVC2008 will MS übrigens auch TR1 in ein paar Monaten nachreichen, als kostenloses Upgrade.