我在这里有这段代码。目的是制作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