Klasse sei Array, welche Operatoren wie?
-
Hallo,
ich wollte mal fragen, was ich in folgender Situation machen soll:
Ich habe eine Klasse A, wobei sie auch als Ersatz für arrays (zB float[5]) dienen soll ( welches dann in A enthalten ist), sodass ich bestenfalls "&A" schreiben kann, wenn ein float* gefordert ist.
Andererseits soll
A a = &b;
nicht meckern, dass &b kein A sondern ein float* ist.
Also sollte &a nur im Notfall zum float* umgewandelt werden können...Darum fällt eine &-OP-Überladung weg, wie ich das sehe.
Wie macht man das "sauber"?MfG
K-Rotte
-
Bei Arrays ist
&array
nicht die Adresse des ersten Elements, sondern ein Zeiger auf das Array. Also wirklich 'Zeiger auf Array' als Typ, nicht 'Zeiger auf Elementtyp'. Stattdessen istarray
(ohne &) ein Zeiger auf das erste Element.Unter der Annahme, dass du das auch so willst (und es würde auch zu deinen anderen Anforderungen passen), dann müsstest du den Konvertierungsoperator zu
float*
überladen.Und nein, das würden nur wenige Leute "sauber" nennen. Nicht, weil es technisch falsch wäre, sondern weil es kaum etwas nervigeres gibt als solche versteckten Konvertierungen. Das ist schon bei Arrays der Hauptgrund, wieso so viele Leute Probleme mit ihnen haben.
-
Ok Klasse an Array-Syntax anpassen macht Sinn. Wobei mir der Cast auch grausam vorkommt.
Eine Frage hätte ich noch:
Wenn ich jetzt z.B.fkt( A(42.0f) )
habe, lebt A(42.0f) und das darin enthaltene Array, das irgendwie mit 42.0f init wurde, dann wenigstens bis zum Ende der Funktion, oder sogar noch länger??
Oder kann man mit solchen Casts oder OP Überladungen unbeabsichtigt irgendwelche Compiler-Warunungen oder so umgehen?
...Und macht es einen Unterschied ob fkt() : fkt(float[]) oder fkt(A) ??
-
K-Rotte schrieb:
Ok Klasse an Array-Syntax anpassen macht Sinn. Wobei mir der Cast auch grausam vorkommt.
Welcher Cast? Du hast dir doch gewünscht, dass es ohne geht und so geht es ohne. Und das ist meiner Meinung nach grauenhaft. Mit explizit nötigem Cast (indem du den Konvertierungsoperator mit dem Schlüsselwort explicit versiehst) ginge es auch.
Eine Frage hätte ich noch:
Wenn ich jetzt z.B.fkt( A(42.0f) )
habe, lebt A(42.0f) und das darin enthaltene Array, das irgendwie mit 42.0f init wurde, dann wenigstens bis zum Ende der Funktion, oder sogar noch länger??
Als Faustregel kannst du dir merken, dass temporäre Objekte leben, bis der Ausdruck abgearbeitet wurde. Wäre ja auch schlimm, wenn das anders wäre, dann könnte man die Sprache direkt in die Tonne werfen.
Die genauen Regeln sind etwas komplizierter, aber das ist hier nicht erheblich.
Oder kann man mit solchen Casts oder OP Überladungen unbeabsichtigt irgendwelche Compiler-Warunungen oder so umgehen?
Nochmal: Welcher Cast? Und ja, Casts können manchmal gefährlich sein, deshalb sind sie in C++ auch sehr explizit. Und deswegen sind implizite Konvertierungsoperatoren so gefährlich, weil man dann eben keinen Cast mehr braucht. Was manchmal zu recht überraschendem und schwer nachvollziehbarem Verhalten führen kann. Siehe meine sämtlichen Kommentare zu deinem Vorhaben. Die meisten Leute waren froh, als C++-Arrays eingeführt wurden, weil diese sich nicht mehr so verhielten, wie Arrays in C…
...Und macht es einen Unterschied ob fkt() : fkt(float[]) oder fkt(A) ??
Bezüglich der Lebenszeit temporärer Funktionsargumente? Nein.
-
Jau, danke.
Manche Funktionen erwarten leider nur "array-pointer"..
-
K-Rotte schrieb:
Jau, danke.
Manche Funktionen erwarten leider nur "array-pointer"..Aber was findest du verkehrt da dran, diese dann so zu benutzen, wie du es mit einem normalen C++-Container aus der STL tun würdest?