Es gibt zwei Möglichkeiten. Der offensichtliche Weg, den Sie erwähnen, ist C++ 11 zu verwenden und es selbst in QList<const Bar*>
zu konvertieren.
QList<const Bar*> getList() const
{
QList<const Bar*> list;
for(Bar *b : m_List) //where m_List is your private memebr QList<Bar*>
list << b;
return list;
}
Der andere Weg ist die QList
sich const QList<Bar*>
zu konvertieren, die „magische Weise“ durch Rücksendung der Liste aus einer konstanten Funktion zum Beispiel durchgeführt werden kann:
const QList<Bar*> getList() const
{
return m_List; //where m_List is your private memebr QList<Bar*>
}
Welches auf Ihrem hängt zu verwenden braucht. Nach dem, was Sie beschreiben, müssen Sie die Elemente überprüfen, ohne sie zu ändern. Das hört sich so an, dass Sie die modifizierbare Liste gar nicht benötigen. Die erste Variante klingt schon wie ein Overkill. Sie wollen const Bar*
vermutlich, weil Sie nicht möchten, dass es sich durch Zufall ändert, wenn Sie das Element überprüfen. Um alle Elemente zu untersuchen zum Beispiel könnten Sie tun (Hinzufügen const automatisch für jedes Element):
for(const Bar *b : myObject->getList())
//do only const stuff with b
Wenn Sie einen wirklich guten Grund haben für die Rückkehr QList<const Bar*>
wie, dass Sie die Liste müssen modifizierbar sein, ist es nicht wert, die Ärger und Leistungseinbruch. Sie können Bar *
mit const einschränken, wenn Sie selbst darauf zugreifen, indem Sie C++ 11 for
in einer Weise verwenden, die ich beschrieben habe, oder indem Sie konstante Iteratoren verwenden. Von dem, was ich sammle, würde ich empfehlen, das zu verwenden, anstatt (möglicherweise große) Listenwerte in const umzuwandeln.
Und ein letzter Tipp, wenn Sie Ihre Listen wirklich riesig sind, und Sie müssen jeden Tropfen der Leistung berücksichtigen:
const QList<Bar*> &getList() const
Die implizite gemeinsame Nutzung von Qt tut dies im vorherigen Code-Snippet auf seine eigene Ich glaube aber das stellt sicher, dass die Liste bei der Inspektion niemals kopiert oder geändert wird.
Siehe http://stackoverflow.com/questions/10265695/treat-vectorint-as-vectorconst-int-without-copying-c0x Ich kenne keine Lösung (außer vielleicht einen riesigen hässlichen Hack), aber ist ein 'for' loop so eine große Sache?Es ist einfach, Zeiger zu kopieren, ich bezweifle, dass es sich auf Ihre Leistung auswirken wird - es sei denn, die 'QList' ist riesig und Sie haben sehr hohe Leistungsanforderungen. – Armaghast
Überprüfen Sie auch http://stackoverflow.com/questions/2102244/vector-and-const für den Grund. – Armaghast
In diesem speziellen Fall ist es keine große Sache (und ich habe es so umgesetzt). Aber es verstört meinen Sinn für Stil, und in anderen Fällen in meiner Anwendung (interaktive Datenvisualisierung) könnte ich interaktive UI-Operationen auf Containern von ~ 1000-10000s Chart Glyph-Objekten durchführen müssen, wobei ich die Glyph-Objekte inspiziere, aber nicht verändere ohne die UI zu verzögern, nur um einen Container mit Const-Zeigern zu erhalten. – eclarkso