Eine std :: list als schreibgeschützt anzeigen

8

Ich habe eine Klasse, die unter anderem eine std :: list enthält. Ich möchte diese Liste nur so darstellen, dass die Struktur und die darin enthaltenen Daten nur gelesen werden, aber immer noch mit Iteratoren verwendet werden können.

Die Art, wie ich es atmend habe, ist, eine Kopie der Liste zurückzugeben. Das lässt meine Klasse "sicher", aber natürlich wird der Anrufer nicht daran gehindert, seine Kopie der Liste zu ändern und nicht die richtigen Daten zu erhalten.

Gibt es einen besseren Weg?

    
Tim Jones 04.06.2010, 18:16
quelle

5 Antworten

15

Warum gibst du stattdessen nicht const std::list& zurück?

    
JaredPar 04.06.2010, 18:18
quelle
9

Anstatt die Liste selbst (überhaupt) verfügbar zu machen, muss const_iterator s nur an ihrem Anfang und Ende angezeigt werden. Siehe cbegin() und cend() für Hilfe dabei ...

    
Jerry Coffin 04.06.2010 18:18
quelle
4

Gibt eine const-Referenz zurück:

%Vor%

oder gebe einfach const iterators zurück:

%Vor%     
James McNellis 04.06.2010 18:18
quelle
4

Es besteht ein Abhängigkeitsproblem bei der Offenlegung des Datenelements gegenüber der Außenwelt.

Wenn Sie sich dafür entscheiden, Ihr Attribut etwas besser zu ändern (weil list der letzte Auswegcontainer ist) oder weil Sie neue Anforderungen haben, werden alle Ihre Clients davon betroffen sein, und das ist schlecht.

Eine einfache Alternative ist es, ein typedef anzubieten:

%Vor%

Wenn Ihre Kunden Ihren Alias ​​verwenden, ist es eine einfache Sache, den Code neu zu kompilieren.

Eine andere Alternative besteht darin, eine eigene Iterator-Klasse (nicht so schwierig) zu erstellen, die den eigentlichen Iterator einbindet.

%Vor%

Sie leiten einfach alle Operationen an den tatsächlichen Iterator weiter, und Ihre Clients (obwohl sie neu kompilieren müssen, wenn Sie Ihren Container ändern) können nicht versehentlich einen unalasierten Typ verwenden.

Dann ist die dritte Lösung ähnlich wie die erste, außer dass Sie den Typ abstrahieren ... es ist jedoch ziemlich ineffizient (für eine Liste), also würde ich es nicht wirklich empfehlen: Iteratoren sollen billig zu kopieren sein, Sie möchten nicht new irgendetwas.

    
Matthieu M. 04.06.2010 18:33
quelle
3
%Vor%     
sbi 04.06.2010 18:26
quelle

Tags und Links