Fehler aufgrund Bearbeitungsreihenfolge
-
Folgender Code hat zu einem Fehler geführt, der laut der riesigen Liste von Fehlermeldungen irgendwas mit der getId()-Methode von scene zu tun haben sollte.
void create(std::unique_ptr<Scene> scene) override { container[scene->getId()] = std::shared_ptr<Scene>(std::move(scene)); }
Ich hab jetzt echt lange gesucht, bis ich auf das für mich nicht so offensichtliche gekommen bin.
Durch die Umwandlung des unique_ptr in einen shared_ptr wird natürlich der unique_ptr zerstört und damit läuft der Zugriff auf scene->getId() in einen nullptr.
void create(std::unique_ptr<Scene> scene) override { auto id = scene->getId(); container[id] = std::shared_ptr<Scene>(std::move(scene)); }
Ich habe aufgrund meines Links-nach-rechts-Denkens lange gebraucht, um auf die funktionierende Lösung zu kommen.
Meine Frage:
War das für einen Profi anhand des Codes sofort zu sehen? Oder ist es nicht vorhersehbar, in welcher Reihenfolge ein Compiler das bearbeitet?
-
temi schrieb:
War das für einen Profi anhand des Codes sofort zu sehen? Oder ist es nicht vorhersehbar, in welcher Reihenfolge ein Compiler das bearbeitet?
Ich zumindest hätte das nicht auf den 1. Blick gesehen. Vermutlich auch nicht auf den 2. Ob er/sie mich als Profi ansehen will muss jeder selbst entscheiden. (Im ursprünglichen Sinn des Wortes bin ich es auf jeden Fall, da ich seit vielen Jahren mein Geld als C++ Programmierer verdiene.)
Doppelter Leger hier: Erstmal sieht es nicht wie ein Funktionsaufruf aus (obwohl es einer ist). Und dann (2) ist der operator = auch noch ne Memberfunktion. D.h. selbst wenn man es als Funktionsaufruf schreibt...
void create(std::unique_ptr<Scene> scene) override { container[scene->getId()].operator =(std::shared_ptr<Scene>(std::move(scene))); }
sieht es immer noch "OK" aus. Weil der
this
Parameter hier wieder nicht in der Parameterliste innerhalb der Klammern auftaucht, sondern "versteckt" auf der linken Seite ist. Und da macht man schnell den Fehler "von links nach rechts zu denken" wie du es formuliert hast.