wie findet ihr diesen op=?
-
class test{ int [100] a;//irgendeine var void Swap(test& Object){ swap(a,Object); } public: test& operator=(const test& Objekt){ test temp(Objekt); Swap(temp); return *this; } };
wie findet ihr diesen op=?
-
Hm, ist zwar eine Möglichkeit, wie ich finde aber definitiv nicht die beste. Mal davon abgesehen, dass Du dein temp-Objekt eher so anlegen solltest
test temp(Objekt);
Hast Du durch Kopierkonstruktor und den Aufruf von 2 Funktionen wahrscheinlich unnötigen Overhead. Klar, ist wahrscheinlich nur ein schnelles Beispiel gewesen und nur deswegen mit so einfachen Daten drin, aber ich denke zumindest in diesem Fall wäre ein memcpy() oder sowas angebrachter
Kann natürlich sein, dass ich mich da täusche, vielleicht kann mal einer der *wirklichen* Profis was dazu sagen...
-
otze schrieb:
class test{ int [100] a;//irgendeine var void Swap(test& Object){ swap(a,Object); } public: test& operator=(const test& Objekt){ test(Objekt) temp; Swap(temp); return *this; } };
wie findet ihr diesen op=?
Bis auf die syntaktischen Fehler ist dieser Ansatz sehr gut. Sie hat zumindest zwei große Vorteile:
1. Der Kopierkonstruktor und der Zuweisungsoperator haben sehr ähnliche Aufgaben. Änderungen an einer Methode werden meist auch an der anderen vorgenommen. Um Codeduplizität zu vermeiden wird diese Logik nur noch im Kopierkonstruktor geschrieben.
2. Der Zuweisungsoperator gibt automatisch die gleiche Zusicherung der Ausnahmefestigkeit wie der Kopierkonstruktor. Gibt der Kopierkonstruktor die strenge Zusicherung, wird sie auch automatisch vom Zuweisungsoperator gegeben.
-
der syntaxfehler kam einfach durch schludrigkeit, als ich das beispiel aufgestellt hab.
@ponto genau so war das gedacht,nur noch mit der zusicherung, dass die klasse bei einer exception im copy-ctor im gleichen zustand wie vorher verbleibt,sodass das programm rein theoretisch normal weitergeführt werden kann.
@Deadlef der aufruf von Swap ist nich so teuer, immerhin sollte ein guter compiler das inlinen
-
otze schrieb:
@ponto genau so war das gedacht,nur noch mit der zusicherung, dass die klasse bei einer exception im copy-ctor im gleichen zustand wie vorher verbleibt,sodass das programm rein theoretisch normal weitergeführt werden kann.
Der Kopierkonstruktor sollte auch dafür sorgen, dass keine Speicherlecks oder ähnliches auftreten, wenn eine Exception darin geworfen wird.
std::swap gibt es nicht für alle Objekte, zum Beispiel nicht für int a[100].
-
klar, aber es funktioniert für new pointer etc,und es sollte ja nur ein kleines dummes beispiel sein, und ich hab so 3 sekunden lang verzweifelt nach einem objekt gesucht, dass im ersten moment komplexx genug ist, ein swap zu rechtfertigen, ein beispiel mit new wäre nich ohne ctor ausgekommen, und das wollte ich irgendwie vermeiden,wogegen ein beispiel mit nem ganz trivialen typ kein swap rechtfertigt,nunja, da hab ich michd ann falsch entschieden^^
aber das mit dem copy ctor is klar,es geht hier eher ums swap,das swap verhindert, dass im falle von a=b a verändert wird, bevor klar ist, dass alles klappt,wenn schon daten überschrieben werden, und dann zb bei einem new ne exception geworfen wird,dann ist der bereits überschriebene wert unwiederbringlich verloren, und die klasse verbleibt in einem undefinierten Zustand.
-
Kürzer:
test& operator=(test Objekt){ Swap(Objekt); return *this; }
Wieso per Referenz übergeben, wenn du es doch kopieren willst.
-
soweit war ich mit meinen überlegungen noch garnicht
-
Helium schrieb:
Kürzer:
test& operator=(test Objekt){ Swap(Objekt); return *this; }
Wieso per Referenz übergeben, wenn du es doch kopieren willst.
Sollte man das wirklich so machen?
Bisher hatte ich es immer nur gesehen wie otze es gemacht hat. (const-Referenz, dann temporäre Kopie)
-
nein, der sutter findet das so auch toll
-
Helium schrieb:
Kürzer:
test& operator=(test Objekt){ Swap(Objekt); return *this; }
Wieso per Referenz übergeben, wenn du es doch kopieren willst.
diesen mist lese ich heute zum zweiten male.
warum?
tut es euch so weh, eine zeile mehr zu schreibseln?
test const& Object ist die _natürliche_ übergabe für objekte. warum sie nicht nehmen. allein schon aus denkfaulheit ist es gebot.
und wer sich hie rnicht zur denkfaulheit klar bekennt, gehe bitte zurück auf "los" und ziehe nicht 4000Eu ein.
denkeinfacher code ist automatisch fehlersuchfreundlicher code. oder?
also weg mit welchen speziellen vereinfachungen, die mal "hier" eine zeile sparen tun.und?
hab ich mir doch gedacht. ihr glaubt mir wiedermal kein wort.
dann zu den fakten.
wer ruft den copy-ctor beitest& operator=(test Objekt){ Swap(Objekt); return *this; }
eigentlich auf? das ist wohl der aufrufer.
und wer macht es beitest& operator=(test & Objekt){ test tmp(Object); Swap(tmp); return *this; }
? das ist wohl der op=.
der erzeugte code wird also kürzer, wenn man den längeren sourcecode schreibt. falls da sachen nicht trivial inline sind. bei triv inline isses egal, was man schreibt.
also ich resümiere: es ist heute modern, zeilen sourcecode zu sparen, deutlich auf kosten der lesbarkeit, eventuell auf kosten der laufzeit, sicher nicht zu gunsten von laufzeit oder lesbarkeit.hab ich denn all die jahre vergebens gepredigt? und ich sag ja nix neues. scott meyers sagte es damals per buch mir und ich sag es doch nur weiter.
manchmal mag ich mir die tastatur gegen den kopp hauen, heute ist es wiedermal so weit.
wißt ihr was, ich mache einen aufruf.
also mal Shade, bja, Hume, Marc++us, Bashar, Elise, Fux (lange nicht gesehen), Gregor, TheBigW, DrGreenthumb, (und weitere 10 chefs, die mir gerade nicht einfallen (wirklich nicht, aber das ist ein fehler von mir. ich kann mir ja nicht mal merken, was ich. bin halt informatiker und bin auf strukturen geeicht, nicht auf daten.)). lasst uns den vermaledeiten stil voranbringen, indem wir lehren. indem wie denken lehren, nicht gedachtes.
zum beispiel, jeder mit weniger als 10 postings kriegt die frage glatt beantwortet. zwischen 10 und 20 kriegt er einen fehler rein, ab 20 sogar ne frage. und ab 100 kriegt er nur noch nonsense gepostet. ist ja nur fair, geht und ja nicht anders.
ich mache das übrigens schon so.
-
zum beispiel, jeder mit weniger als 10 postings kriegt die frage glatt beantwortet. zwischen 10 und 20 kriegt er einen fehler rein, ab 20 sogar ne frage. und ab 100 kriegt er nur noch nonsense gepostet. ist ja nur fair, geht und ja nicht anders.
ich mache das übrigens schon so.Und ab 1000 wird man gebannt.
-
Optimizer schrieb:
...
ups, hab dich vergessen. und otze.
-
lasst uns den vermaledeiten stil voranbringen, indem wir lehren. indem wie denken lehren, nicht gedachtes.
zum beispiel, jeder mit weniger als 10 postings kriegt die frage glatt beantwortet. zwischen 10 und 20 kriegt er einen fehler rein, ab 20 sogar ne frage. und ab 100 kriegt er nur noch nonsense gepostet. ist ja nur fair, geht und ja nicht anders.
ich mache das übrigens schon so.du bist also der meinung, dass wir sozusagen eine lernkurve des selbstständigen denkens hier in diesen bereich bringen?
die idee is vielleicht garnicht mal so schlecht, im beruf wird uns natürlich auch keiner mehr helfen, wir müssen das dann ja können.vielleicht sollte das aber vielleicht so aufgeteilt werden:
bis 10 fragen gibts den source der das problem löst,
bis 20 nurnoch ein ausschnitt,bis 50 nurnoch schlüsselzeilen, und ab 100 nurnoch der theoretische teil.vielleicht sollten wir syntax/stilfragen aber en bissl ausklammern, da man einerseits auf solch sachen wie template template parameter von selbst nicht kommt(gibts bei mir noch nichtmal in der hilfe),und solch sachen wie guten stil kann man nur durch jahrelange erfahrung lernen,oder indem jemand einem sagt,wie guter code auszusehen hat(guter stil wird auch in den "lehrbüchern" ausgeklammert, maximal kommt noch ein "tiefe verschachtelungen meiden,eine anweisung-eine zeile,einrücken")