我正试图理解并实现俄罗斯方块项目的常规正确性。
这是我在尝试添加常量问题时遇到的一个经常出现的问题。
我有一个(Piece)类,其中一个私有成员是
Point rotationCenter;
我正在尝试写一个这样的吸气剂:
inline Point & Piece::getRotationCenter() const
{
return rotationCenter;
}
之前,我有相同的吸气剂,但不是作为const功能,并且正在工作。现在,我得到了C2240错误“无法将const Point转换为Point&”。
我该怎么做才能纠正这个问题?我应该在没有getRotationCenter
的情况下离开const
吗?
答案 0 :(得分:33)
为什么无法将
spec1 test new cars check color check model check motor
转换为$row.Path = $path.InnerText.Replace("/Folder1/Folder2/folder3/folder4/","")
?
因为如果允许,以下危险代码变为有效:
usp_StoredProcedurename.prc,
fn_FunctionName.udf
File.sql
我该怎么做才能纠正这个问题?我应该在没有
const X
的情况下离开X &
吗?
这取决于你的意图。如果可以修改返回的对象,则使成员函数为非const并返回const int x = 0;
int& rx = x; // bind const variable to reference (to non-const)
rx = 99; // oops, try to modify the const variable via the reference
。如果没有,则保留成员函数getRotationCenter
并返回类型const
。 const成员函数是指不会修改(或提供修改)对象(及其成员)的承诺。
答案 1 :(得分:13)
在Point&
个成员函数中,所有类数据成员都是const
。您不能将非const Point&
引用绑定到const
成员数据,因此会出现编译器错误。
如果您不希望调用者修改const
,则可以const
或const
返回。
rotationCenter
如果你确实希望调用者修改Point
(我通常不推荐),请写两个重载:一个按const Point&
返回,另一个按inline const Point & Piece::getRotationCenter() const
{
return rotationCenter;
}
返回,具体取决于你称之为对象的资格:
rotationCenter