Sollen Memberfunktionen "const" sein, wenn sie den logischen Zustand, nicht aber den bitweisen Zustand beeinflussen?

7

Ich schreibe eine Klasse, die eine veraltete C-API umschließt, die ein Hardwaregerät steuert. In einem vereinfachten Beispiel könnte ich etwa Folgendes haben:

%Vor%

Die Klasse selbst hat keinen bitweisen Zustand; Daher könnte ich set_request() als const deklarieren und der Compiler wäre damit zufrieden. Aber wäre dies aus semantischer Sicht der richtige Ansatz, da das beobachtbare Verhalten des Objekts beeinflusst wird? (d. h. das eingekapselte Hardware-Gerät hat sehr viel hat einen Zustand.)

    
Oliver Charlesworth 06.03.2011, 02:14
quelle

4 Antworten

18

Ich glaube, dass const logisch const-ness widerspiegeln sollte, unabhängig von der internen Darstellung. Nur weil Ihr Objekt nur einen Zeiger auf etwas enthält, das sich ändert, bedeutet das nicht, dass alle Ihre Mitgliedsfunktionen const sein sollten.

C ++ hat sogar das mutable -Konzept für die interne Repräsentation, das geändert werden muss, auch wenn das Objekt konzeptionell nicht funktioniert. Das Schlüsselwort const ist eindeutig nicht dazu gedacht, "bitweise" Konstanz darzustellen.

    
Greg Hewgill 06.03.2011, 02:18
quelle
9

Wenn der Status geändert wird, sollte nicht const sein. Die Tatsache, dass der fragliche Zustand remote ist (d. H. In einem kontrollierten Gerät), ändert das nicht.

    
Jerry Coffin 06.03.2011 02:18
quelle
3

Ein nützlicher Test ist:

könnte Code mit nur const Zugriff auf die Geräteinstanz interferieren mit der Operation von Code mit nicht const access

Grundsätzlich bedeutet const access, dass du effektiv ein Beobachter bist. Hier sieht es so aus, als ob der Code, der set_request(...) zur Zeit T1 und dann get_response() zur Zeit T3 aufruft, ernsthaft geschraubt wird, wenn ein vermeintlicher Beobachter set_request() mit verschiedenen Parametern zur Zeit T2 anruft. Aus diesem Grund sollte set_request(...) für Beobachter nicht zugänglich sein - es sollte nicht const sein.

(Es gibt Vorbehalte gegenüber dem Test - zB wenn ein const "observer" eine Sperre benötigt, kann er offensichtlich die nicht const Verwendung von einem anderen Thread aus einer Timing-Perspektive beeinflussen, sollte dies jedoch nicht von einer funktionalen tun - aber es ist ziemlich offensichtlich, wie man das in Ihre Analyse einbezieht).

    
Tony Delroy 28.07.2011 01:34
quelle
2

Wie andere Typ- und Mitgliedsqualifikationen (z. B. öffentlich, privat, virtuell) drückt const sowohl die Absicht als auch die Sprachsemantik (d. h. Sicherheitsmerkmale) aus, die diese Absicht unterstützen. In diesem Fall würde die Intention kontraintuitiv erscheinen, selbst wenn die zugrundeliegende Semantik sicher wäre. Ich würde es nicht tun.

    
Jollymorphic 06.03.2011 02:18
quelle

Tags und Links