Ho questo frammento di codice qui. L'intenzione è di fare una copia di initialData. Dal momento che non sto modificando initialData in alcun modo, immagino che dovrei passarlo come riferimento const. Tuttavia, continuo a ricevere questo messaggio durante la compilazione.C++ e const-accesso a una funzione membro di un riferimento const
\ src \ Scene \ SceneAnimationData.cpp (23) :. Errore C2662: 'SceneTrackerData :: getRect': non può convertire puntatore 'this' da 'const SceneTrackerData' a 'SceneTrackerData &'
#include "SceneTrackerData.h"
void SceneAnimationData::SetupData(const SceneTrackerData &initialData)
{
// getRect(), points() and links() all return const pointers
CloneRect(initialData.getRect());
ClonePoints(initialData.points()->values());
CloneLinks(initialData.links()->values());
}
void SceneAnimationData::CloneRect(const QGraphicsRectItem * initialRect)
{
if (initialRect != NULL)
{
QPointF position = initialRect->scenePos();
QRectF rect = initialRect->rect();
initialRect = new QGraphicsRectItem(rect);
initialRect->setPos(position);
}
}
void SceneAnimationData::CloneLinks(const QList<QGraphicsLineItem*> links)
{
links_ = new QList<QGraphicsLineItem*>(*links);
}
void SceneAnimationData::ClonePoints(const QList<QGraphicsEllipseItem*> points)
{
points_ = new QList<QGraphicsEllipseItem*>(*points);
}
una domanda - non const per getRect (void) implica che non posso cambiare Rect? So che il compilatore non può "vedere" questo - ma la mia ipotesi è che non tutti i metodi di Rect sono const. Senza che tutti siano costanti, non puoi fare affidamento su getRect senza modificare Rect. Sarebbe più chiaro (in questo caso) gettare via la costanza nell'altra funzione invece di aggiungerla qui? –
Fintanto che getRect non chiama nessuno degli altri metodi non-const di Rect, o esegue altre modifiche, getRect può garantire che non modifica il Rect. Ciò significa che posso chiamare getRect su un oggetto const Rect - tuttavia, ci sarebbe un errore di compilazione se provassi a chiamare un altro metodo non const sullo stesso oggetto. Ecco come viene preservata la costanza: avendo le chiamate al metodo non const falliscono, mentre le chiamate al metodo const sono permesse. – GRB