Frage zu copy contructor.
-
class foo { public: void bar(const std::string name); private: std::map<const std::string, something> objects; }; void foo::bar(const std::string name) { // sonstiger code somthing st; // sonstiger code & initialisierungen objects[name] = st; // sonstiger code }Darf ich innerhalb einer Membermethode (bar)( der Klasse (foo) )einer std::map ein objekt st ( something) zuweisen, wobei die Klasse somthing keinen expliziten Copy contructor und auch keinen assignment operator '=' besitzt?
Der compiler erstellt zwar selebr welche aber ich bin mir nicht sicher obs so geht.
ps: Wenn ich aus einer std::map per key einen value abfrage, wobei key nicht existiert, wie kann ich das dann herausfinden? Also herausfinden dass der key ungültig ist, also dass der Eintrag innerhalb der map nicht existiert?
-
@ps:
wenn du mit
wert = map_[key].value;
versuchst einen key anzusrpechen, der gar nicht existiert, so wird der key erstellt und mit dem ergebnis des Standardkonstruktors des valuetypes gefüllt.
rausfinden, ob der key existiert geht mit
map::find wenn find map:.end() zurückgibt, existiert der schlüsel nicht
-
Die kannst Klassen ohne explizit definierten Copy-Konstruktor und/oder Zuweisungsoperator in Zusammenhang mit der STL nutzen, wenn die automatisch generierten Funktionen ihren Zweck erfüllen.
Das ist zum Beispiel nicht mehr der Fall, wenn die Klasse Zeiger als Membervariablen hat und für das Löschen des Objekts verantwortlich ist, auf das gezeigt wird. Eventuell können da Smart Pointer helfen (std::auto_ptr ist allerdings nicht geeinget).
-
Z2 schrieb:
Die kannst Klassen ohne explizit definierten Copy-Konstruktor und/oder Zuweisungsoperator in Zusammenhang mit der STL nutzen, wenn die automatisch generierten Funktionen ihren Zweck erfüllen.
Das ist zum Beispiel nicht mehr der Fall, wenn die Klasse Zeiger als Membervariablen hat und für das Löschen des Objekts verantwortlich ist, auf das gezeigt wird. Eventuell können da Smart Pointer helfen (std::auto_ptr ist allerdings nicht geeinget).
Also die Sache ist die:
Die Klasse hat einen Zeiger als Membervariable. Zudem kommen noch diverse andere Membervariablen + zeiger hinzu, welche diese Klasse von einer anderen Klasse erbt etc. (Mehrfachvererbung).ps: Einen Zeiger, den die Klasse erbt, den muss/darf sie NICHT freigeben, da dies außerhalb dieser Klasse geschieht.
Also was würdest du mit empfehlen?
ps: Angenommen ich hab einen Zeiger auf eine struct, welche versch. Daten enthält, unter anderem auch einen zeiger. Wie kopiere ich dann das????
-
Deep Copy, d.h. du mußt auch Kopien von den Objekten machen, auf die gezeigt wird. Oder du nimmst gleich geeignete Smart Pointer. Boost bietet da einiges an.
Edit:
ps: Einen Zeiger, den die Klasse erbt, den muss/darf sie NICHT freigeben, da dies außerhalb dieser Klasse geschieht.
Diesen Zeiger kannst du ganz normal kopieren. Da sind keine besonderen Maßnahmen notwendig.
-
Vielen Dank für die Hilfe.