In una funzione membro non-const della classe Foo
puntatore this
è del tipo Foo* const
- cioè, il puntatore è const, ma non l'istanza cui punta. In una funzione membro const, tuttavia, il puntatore this
è del tipo const Foo* const
. Ciò significa che anche l'oggetto a cui punta è costante.
Pertanto, nel tuo esempio, quando si utilizza this->m_bar
(di cui m_bar
è solo la forma abbreviata), poi m_bar
è un membro di un oggetto costante - che è il motivo per cui non è possibile tornare come riferimento non-const.
Questo rende effettivamente senso da un POV di progettazione: Se questo Foo
oggetto è un oggetto costante, e si è permesso di richiamare Foo::bar
per gli oggetti costanti, quindi, se questo sarebbe ritornato un riferimento non const ad alcuni interni cui è possibile giocherellare con, saresti in grado di cambiare lo stato di un oggetto costante.
Ora devi guardare il tuo disegno e chiediti come sei arrivato a questo punto e qual è la tua intenzione attuale. Se il membro m_bar
non fa realmente parte dello stato dell'oggetto (ad esempio, è solo lì per scopi di debug), allora potresti prendere in considerazione l'idea di renderlo mutable
. Se fa parte dello stato dell'oggetto, allora devi chiederti perché vuoi restituire un riferimento non-const ad alcuni dati interni di un oggetto costante. O rendere la funzione membro non-const, o restituire un riferimento const o sovraccaricare la funzione membro:
class Foo {
public:
const QPoint& bar() const {return m_bar;}
QPoint& bar() {return m_bar;}
// ...
};
Grazie. Pensavo che il qualificatore di funzione const fosse pensato solo per garantire che la funzione stessa non modificasse l'oggetto. Voglio che m_bar sia modificabile, quindi ho rimosso il qualificatore. – Dimitris
In realtà impedisce alla funzione di modificare l'oggetto, ma lo fa solo consegnando un oggetto const alla funzione. Tuttavia, la funzione per la quale non è possibile fornire un riferimento non const è più di un effetto collaterale accidentale: non si dovrebbe essere in grado di ottenere riferimenti non const a un oggetto costante in alcun modo. – sbi