Ich habe thread-sichere Document
Klasse für benutzerdefinierte Dokument. Es hat getters (const functions) und Setter ihren Zustand zu ändern. Alle diese Funktionen sind mutex-geschützt, um zu garantieren, dass das Dokument nicht geändert wird bis die Methode vollständig ausgeführt wird.Kann Mutex-Locking-Funktion als const markiert werden
Aber aufgrund QMutex
Nutzung, ich kann nicht staatlich zugegriffen Funktion als const
ohne mutable
Nutzung markieren. Capturing QMutex
ändern Sie den Status.
Ist dieser Code korrekt, oder kann er auf eine schönere Art und Weise geschrieben werden? Ohne hacky mutable
Verwendung.
class Document
{
// This method should be const: it changes only mutex
// and don't touch document state
bool IsCorrect() const;
...
mutable QMutex m_lock;
};
bool Document::IsCorrect() const
{
// Capturing mutex object change it!
QMutexLocker lock(&m_lock);
... Const-aware code
bool result = (m_context != NULL);
...
return result;
}
Diese Verwendung von "veränderbar" ist nicht "hacky" ... es ist genau das, was "veränderbar" für (aber nicht ausschließlich) ist - z.B. Caching-Ergebnisse, Instrumentierung sind gleichermaßen gültige Verwendungen). –
Ein anderes Beispiel für "mutable" könnte ein Cache (interne Repräsentation des externen Zustands) sein, der beim Auslesen aktualisiert werden kann. Selbst wenn eine Lesefunktion const ist, kann sich der Cache ändern, aber das bedeutet nicht, dass der Status von das Objekt hat sich geändert. – stefaanv
@TonyD Mein Chef sagt etwas wie "const-Funktion darf nichts ändern - und Mutex ist ein Teil des Dokument-Status, Änderungen implizit ist verwirrend". Soll ich ihm über logische und bitweise Konstanz erklären? – eraxillan