RAII ist falsch benannt, wie (ich glaube) Scott Meyers weist darauf hin.
Es sollte nicht „Ressourcenerfassung ist Initialisierung“ genannt werden, es sollte „Destruction ist Ressourcen Release“ bezeichnet werden. Aber wir sind, wo wir sind.
Wenn die Zelle „besitzt“ das Objekt von representation_
spitz, und löscht sie in seinem destructor, dann ist dies immer noch eine Form der RAH ist, die gleiche Art und Weise, dass Sie ein shared_ptr
mit einem Null-Zeiger initialisieren können, dann später eingestellt es zu etwas anderem. Ich gehe davon aus, dass Sie es korrekt verwenden (stellen Sie sicher, dass das Objekt unmittelbar nach seiner Erstellung in einer Zelle oder einer anderen Zelle gespeichert wird, ohne dass zwischen dem Abschluss des Konstruktors und dem Speichern des Zeigers irgendwo ein Fehler auftritt, der schließlich freigegeben wird). Wenn ja, verwenden Sie den wichtigen Teil von RAII, obwohl es kein Konstruktor ist, der die Arbeit erledigt.
Es ist wahrscheinlich eine Verletzung der einzigen Verantwortung Prinzip. Sie haben für die eine Zelle Zelle verantwortlich gemacht, und auch für Speicher-Verwaltung dieses QAbstractGraphicsItem
Objekt. Es würde wahrscheinlich Dinge vereinfachen, um representation_
zu einem intelligenten Zeigertyp zu ändern, so dass kein spezieller Code im Destruktor von Cell benötigt wird.
Wenn die Zelle das Objekt, auf das representation_
zeigt, nicht "besitzt", dann verletzt das auch RAII nicht inhärent, es implementiert es einfach nicht. Etwas anderes muss für das Eigentum des Objekts verantwortlich sein. Vielleicht benutzt das andere RAII, vielleicht verletzt es es. Um sicherzustellen, dass das Objekt so lange lebt, wie es die Zelle braucht, müsste es irgendwie in den Lebenszyklus der Zelle involviert sein (wenn es zum Beispiel die Zelle besitzt, wäre es vielleicht in Ordnung). Wenn das nicht der Fall ist, besteht eine gute Chance, dass RAII irgendwie verletzt wird.
Welchen Teil von RAII betrachten Sie hier als defekt? –
Das representation_ member ist die meiste Zeit 0 und wird nicht initialisiert. – problemofficer
Ich denke, das bricht das MVC-Paradigma mehr als das RAII-Paradigma. – filipe