eine konstante Elementfunktion, die einen Zeiger auf eine nicht konstante Elementvariable zurückgibt, warum wäre es gut?

8

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?

    
qonf 07.10.2011, 10:59
quelle

5 Antworten

4

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.

    
Alok Save 07.10.2011 11:04
quelle
1

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.

    
Luchian Grigore 07.10.2011 11:07
quelle
0

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.

    
Kerrek SB 07.10.2011 11:12
quelle
0

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.

    
Puppy 08.10.2011 17:38
quelle
0

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.)

    
Ben Voigt 08.10.2011 17:42
quelle

Tags und Links