Fast alle C ++ - Projekte haben Klassen mit copy c-tor / copy operator / serialize-Methode usw., die normalerweise etwas mit allen Mitgliedern machen.
Aber manchmal vergessen Entwickler, neue Mitglieder zu diesen Funktionen hinzuzufügen.
Weißt du irgendeinen einfachen, nicht alle Mitglieder Weg, der Entwickler daran erinnert, etwas zu tun oder noop (memeber_name_) in diese Funktionen zu schreiben.
Ich habe versucht, etwas zu erfinden, habe aber Schuld.
PS: Komponententests könnten dieses Problem verhindern, aber ich möchte etwas Kompilierzeit.
Verwendet wie folgt:
%Vor% Wenn Sie nun ein " SafeMember<int> age
" -Member hinzufügen und vergessen, Ihren Kopierkonstruktor zu aktualisieren, wird die Kompilierung möglicherweise fehlschlagen.
Und für einen "no-op" Hinweis würde der Entwickler einen Initialisierer wie ": age (0)" hinzufügen.
Hinweis: Dies schützt Ihre operator = () - oder serialize () -Funktionen vor bit-rot nicht, nur die Konstruktoren. Hoffentlich sollte dies jedoch genug sein: Sobald Sie Ihre Auslassungen in den Konstruktoren sehen, werden Sie wahrscheinlich daran denken, auch die anderen Funktionen zu durchlaufen.
Fügen Sie diese Funktionalität Ihrem Komponententest hinzu. Wenn der Komponententest die Serialisierung / Deserialisierung abdeckt (z. B. durch Sicherstellen von deser(ser(x)) == x
), schlägt das Fehlschlagen des Hinzufügens von Mitgliedern zur Serialisierungsfunktion während des Komponententests fehl. Das gleiche könnte für Kopie-Ctors funktionieren.
Es ist nicht so ideal wie Fehler bei der Kompilierungszeit, aber wenn Sie ein gutes Komponententest-Framework haben und sicherstellen, dass Sie eine angemessene Abdeckung haben, dann wären diese Fehler der Vernachlässigung schwerer zu machen.
Es sieht so aus, als ob es keine befriedigende Lösung für Ihr Problem gibt (Iraimbilanja Lösung ist wahrscheinlich einer der besten Ansätze, aber immer noch nicht perfekt). Ich frage mich, ob es in zukünftigen C ++ 0x Features gibt, die es erlauben, das zu lösen?
Ich denke, der beste Weg, um dieses Problem zu vermeiden, ist es am Stamm zu schneiden: Verwenden Sie nicht benutzerdefinierte Kopie Operator / Konstruktor.
Das ist vielleicht nicht immer möglich, aber in den meisten Fällen glaube ich wirklich, dass es ...
istTags und Links c++