Ich arbeite in einer großen Kollaboration (von meist nicht-professionellen Programmierern, ich bin einer von ihnen). Ich sehe regelmäßig Beispiele für die folgenden
%Vor%, wo ein Anwendungsfall wäre
%Vor%Diese Praxis verletzt einen Mieter, der in mich gedrängt wurde, als ich Programmierkurse nahm, d. h., const bezieht sich nicht nur auf die bitweise Struktur der Klasseninstanz, sondern auf die interne logische Struktur. Unter dieser Philosophie sollte die Elementfunktion die folgenden Formen annehmen:
%Vor%Ich habe gehört, dass einige Leute denken, dass const sich nur auf Mitglieder beziehen sollte, die streng mit der C ++ - Terminologie sprechen. Wie / warum würde jemand für diese Art von Praxis argumentieren?
Wenn Sie die Funktion member angeben, wird den Benutzern dieser Funktion angezeigt, dass sie keine any Klassenmitglieder ändern wird.
Das zurückgegebene Member kann oder darf nicht const
sein, aber die Member-Funktion const gibt den Benutzern der Klasse einen deutlichen Hinweis auf das Verhalten der Funktion.
Es hängt weitgehend vom Design ab, aber für Ihren Fall sehe ich nicht, warum Sie zwei Prototypen brauchen.
Die Frage, die Sie sich stellen müssen, ist, ob Sie wollen, dass Leute Ihr T
Mitglied über das get
ändern.
Wenn Sie das tun, sollte Ihr Prototyp wie folgt aussehen:
%Vor%Wenn nicht, machen Sie den Rückgabewert const:
%Vor% Die Funktion muss nicht const
sein, aber sie kann ohne Probleme sein. Würden Sie die Funktion in einer anderen nichtkonstanten Elementfunktion aufrufen? Denn wenn Sie dies planen, wird es nicht funktionieren, da es nicht const
ist.
Da Sie nur einen Zeiger auf ein Mitglied zurückgeben und nichts wirklich ändern, würde ich mit der Funktion const
fortfahren. Dies dient auch als Richtlinie für andere, die an dem Projekt arbeiten, dass die Funktion intern nichts ändert.
Die Entscheidung, ob die Rückgabe const
sein soll oder nicht, hängt vollständig vom Design ab.
Ich wollte antworten, dass dies eine Frage des Designs ist, und es ist Ihre Entscheidung, ob Sie mit einem veränderbaren Accessor zufrieden sind (in diesem Fall entscheiden Sie sich für die erste, const
version), oder wenn Sie konstant verbieten wollen Verweise, um den Pointee zu ändern (in diesem Fall entscheiden Sie sich für die zweite Version mit zwei Überladungen).
Aber wenn ich darüber nachdenke, denke ich, dass Ihre Frage zeigt, dass Getter und Setter im Allgemeinen eine schlechte Idee sind. Sie sollten die Teilnehmer nicht einfach blind weiterleiten (in diesem Fall können Sie sie auch einfach zu öffentlichen Mitgliedern machen). Vielmehr sollte Ihre Klasse eine sinnvolle Schnittstelle bieten, die die Implementierung abstrahiert. Im Idealfall sollte die Tatsache, dass in Ihrer Klasse ein roher Zeiger vorhanden ist, für den Benutzer keine Rolle spielen, und Ihre Schnittstellenfunktionen sorgen dafür, dass die entsprechenden logischen Konstanten garantiert werden.
Wenn Sie sich entschließen, auf diese OO-Designprinzipien zu verzichten, dann sind Sie wahrscheinlich auf sich allein gestellt, und Sie sollten alles tun, was Ihrem Gesamtdesign am besten entspricht.
Wahrscheinlich ist die logische Struktur der Klasse irrelevant für die Änderungen, die Sie an den Zielen vornehmen. Betrachten Sie zum Beispiel einen verknüpften Listenknoten. Der Knoten ist so lange konstant, wie der nächste (und möglicherweise der vorherige) Zeiger gleich ist - aber dem Knoten ist es egal, ob Sie den nächsten Knoten ändern. Darüber hinaus könnte T selbst nur ein unveränderliches Objekt im Design sein und daher ist const T
eine bedeutungslose Unterscheidung.
Es ist völlig in Ordnung und nützlich in den gleichen Fällen, dass T* const
ist.
Betrachten Sie eine Hash-Tabelle, auf die von mehreren Threads aus zugegriffen wird. Die interne Struktur muss sich nicht ändern, während ein anderer Thread auf das Objekt zugreift, aber das bedeutet nicht, dass die Hash-Tabelle nur const-Zeiger enthalten muss. (Das Sperren einzelner Objekte ist viel besser skalierbar als das Sperren der gesamten Datenstruktur.)
Tags und Links c++