Ci sono due modi. Il modo ovvio che hai menzionato è di usare C++ 11 e convertirlo tu stesso a QList<const Bar*>
.
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;
}
L'altro modo è quello di convertire il QList
stesso per const QList<Bar*>
che può essere fatto "magicamente" restituendo la lista da una funzione const per esempio:
const QList<Bar*> getList() const
{
return m_List; //where m_List is your private memebr QList<Bar*>
}
quale usare dipende dal vostro esigenze. Da ciò che descrivi hai bisogno di ispezionare gli elementi senza cambiarli. Sembra che in realtà non hai affatto bisogno dell'elenco modificabile. La prima variante sembra già un overkill. Si desidera const Bar*
presumibilmente perché non si desidera che cambi per errore quando si ispeziona l'elemento. Per esaminare tutti gli elementi per esempio si potrebbe fare (aggiungendo const automaticamente per ogni elemento):
for(const Bar *b : myObject->getList())
//do only const stuff with b
Se non avete una buona ragione per la restituzione QList<const Bar*>
come ad esempio che è necessario l'elenco di essere modificabili non vale la pena il guai e danno prestazioni. È possibile limitare Bar *
con const quando si accede a se stessi utilizzando C++ 11 for
in un modo descritto o utilizzando iteratori const. Da ciò che ho raccolto, consiglierei di usare quello piuttosto che convertire i valori della lista (possibilmente enorme) in const.
E un ultimo consiglio, se le liste sono davvero enorme ed è necessario ogni goccia di prestazione considerare:
const QList<Bar*> &getList() const
La condivisione implicita di Qt fa nel precedente frammento di codice sul proprio credo, ma questo assicura che la lista non verrà mai copiata o modificata durante l'ispezione.
Vedere http://stackoverflow.com/questions/10265695/treat-vectorint-as-vectorconst-int-without-copying-c0x Non so una soluzione (tranne forse un enorme brutto attacco), ma è un 'for' loop un così grande affare?Semplicemente copiando i puntatori, dubito che questo influenzi le tue prestazioni - a meno che il 'QList' non sia enorme e tu abbia requisiti di prestazioni molto elevate. – Armaghast
Inoltre, controllare http://stackoverflow.com/questions/2102244/vector-and-const per il motivo. – Armaghast
In questo caso particolare, non è un grosso problema (e sono andato avanti e l'ho implementato in quel modo). Ma offende il mio senso dello stile, e in altri casi nella mia applicazione (visualizzazione dei dati interattiva), potrei aver bisogno di fare operazioni interattive sulla UI su contenitori di oggetti glifi di grafico ~ 1000-10000s in cui sto ispezionando ma non cambiando gli oggetti glifo senza ritardare l'interfaccia utente solo per ottenere un contenitore di puntatori const. – eclarkso