2016-06-19 19 views
1

Ich habe eine Schnittstelle, die Bündel von Const-Methoden hat. In einer der Implementierung der Schnittstelle muss ich die angeforderten Informationen aus einer Datei lesen. Wie zum Beispiel here gezeigt wurde, handelt es sich tatsächlich NICHT um eine const-Operation, da sich das Dateihandle beim Lesen ändert.Implementieren von Const-Methoden einer Schnittstelle und Lesen von Dateien

Grundsätzlich gibt es drei Möglichkeiten, um dies zu realisieren Ich bin mir dessen bewusst:

1) Verwenden Sie temporäre Datei-Handle bei jeder Anfrage.

2) Verwenden Sie PIMPL.

3) Verwenden Sie mutable auf dem Dateihandle.

Die erste Option ist offensichtlich ein Overkill und mit vielen Anfragen fügt viel Overhead hinzu. Die zweite Option fügt Indirection hinzu, scheint aber eine ziemlich Standardlösung zu sein. Die dritte Option hat jedoch keinen Overhead und keine Indirektion, sondern ist im Grunde ein Blankoscheck für Änderungen. Andererseits, obwohl das PIMPL-Idiom das Gleiche nur in einer mehr verschachtelten, aber wohl kontrollierteren Art und Weise tut.

Was wäre die richtige/bevorzugte Art, das Lesen von Dateien in einer const-Methode ohne Vorbehalt der const-Korrektheit durchzuführen?

+0

(3) Ja wenn das Dateihandle NICHT Teil des beobachtbaren Zustands des Objekts ist. –

+0

@RichardCritten Das ist der knifflige Teil, nicht wahr? Das Datei-Handle ist nicht Teil der Schnittstelle, es kann auch nicht direkt referenziert werden, aber sobald es veränderbar ist, kann es beispielsweise auch in const-Methoden in die Datei geschrieben werden und das wäre (über konstante Methoden der Schnittstelle) von außen beobachtbar. – Resurrection

Antwort

1

Legen Sie das Datei-Handle-Objekt nicht direkt in Ihre Klasse.

Lassen Sie Ihre Klasse einen std::shared_ptr enthalten (im Gegensatz zu einem normalen Zeiger, um den Umgang mit RAII selbst zu vermeiden), die sogar eine const-Methode verwenden kann, um zu lesen.

(Sie können/können nicht etwas tun müssen, um in Copykonstruktor Ihrer Klasse und/oder Zuweisungsoperator, um die richtige Semantik für diese Situationen zu bekommen, in Bezug auf die Datei-Handle)

+0

Ich erben von QObject, also kein Kopieren, um sich zu sorgen, und daher könnte std :: unique_ptr imho verwendet werden. Der Vorschlag ist jedoch ziemlich gut, da er die Const-Korrektheit ohne die Umleitung des PIMPL klar bewahrt. Nur neugierig, aber würde veränderbare Datei-Handle-Objekt schlechter/problematisch sein, wenn ein Objekt ein einziger Benutzer dieses Handle wäre? – Resurrection

+0

Ich persönlich würde nichts dagegen haben, ein veränderbares Objekt zu verwenden. Dies ist nur eine Möglichkeit, dies zu vermeiden. –