我在這裏有這段代碼。目的是製作initialData的副本。由於我沒有以任何方式修改initialData,我認爲我應該將它作爲const引用傳遞。但是,我在編譯時不斷收到此消息。C++和const - 訪問const引用的成員函數
的\ src \場面\ SceneAnimationData.cpp(23) :錯誤C2662: 'SceneTrackerData :: getRect':不能 將 '這個' 從 '常量 SceneTrackerData' 指針 '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);
}
一個問題 - 不是const的getRect(void)意味着我不能改變Rect?我知道編譯器不能「看到」這個 - 但我的猜測是並非Rect的所有方法都是const。如果沒有它們是常量,你不能依賴getRect而不改變Rect。它會更清楚(在這種情況下)拋棄其他功能的常量,而不是在這裏添加它? – 2009-08-17 12:30:17
只要getRect不會調用Rect的其他非const方法,或者做任何其他修改,那麼getRect可以保證它不會修改Rect。這意味着我可以在const Rect對象上調用getRect - 但是,如果我試圖在同一對象上調用另一個非const方法,將會出現編譯錯誤。這就是constness被保留下來的原因:通過讓非const方法調用失敗,同時允許const方法調用。 – GRB 2009-08-17 16:00:50