我有这个功能:
Triangle& Triangle::get_largest_triangle(const Triangle& t) const
{
float area_this = get_area();
float area_other = t.get_area();
if (area_other > area_this)
return *this;
else
return t;
}
除非我声明返回的Triangle是常量,即:
,否则这不起作用const Triangle& Triangle::get_largest_triangle(const Triangle& t) const
这是为什么?我是C ++的新手,但据我所知,“这个”和参数列表中的对象都没有在函数中被更改,所以我真的没有看到问题所在。
e.g。如果我想在运行此函数后更改存储在最大三角形中的某些值,该怎么办?
答案 0 :(得分:2)
此函数返回对三角形的非const引用。这意味着调用者可以修改返回的对象。但是它返回对自身的引用(由于函数声明而是const),或者对函数参数(也是const)的引用。所以编译器不会允许它,因为你正在使const对象成为非const。
您可以选择更改函数签名以返回const:
const Triangle& Triangle::get_largest_triangle(const Triangle& t) const
或者使方法成为非const并采用非const引用:
Triangle& Triangle::get_largest_triangle(Triangle& t)
答案 1 :(得分:1)
当您返回t
时,会返回const Triangle&
,t
的类型。
当您声明函数返回Triangle&
时,您将返回不同的类型。请记住,const
是该类型的一部分
Triangle&
不是const Triangle&
。
只需将get_largest_triangle
的返回类型更改为const Triangle&
,或将t
的类型更改为Triangle&
。两者都有他们的缺点和优点。
答案 2 :(得分:1)
考虑使用您的功能
const Triangle t1, t2;
Triangle &t3 = t1.get_largest_triangle(t2);
t3
现在可以修改,但这是对t1
或t2
的引用。因此,您的代码可能会“意外地”丢弃对象的常量。如果这是可能的,那么c ++类型系统将不安全。
理论上,因为t1
和t2
是const,它们可以在非可变形内存中分配,当你尝试通过t3
更改其中一个时,你可以这样做可能会崩溃。
答案 3 :(得分:1)
您正在尝试将t
(对const Triangle
的引用)转换为对可修改Triangle
的引用。这将允许调用者修改t
,这将是一件坏事。
您需要更改退货类型,使其成为const
。
答案 4 :(得分:1)
您已将函数定义为const
,即不更改对象的状态:
Triangle& Triangle::get_largest_triangle(const Triangle& t) const
问题是你返回一个非const引用:
这就是编译器抱怨的原因。只是说你返回一个const的引用来解决你的问题:
const Triangle& Triangle::get_largest_triangle(const Triangle& t) const
答案 5 :(得分:0)
将const引用传递给方法,编译器保证对象不会被更改。您尝试返回同一对象的非const引用,这将导致其失去其常量,并且编译器阻止您这样做。
重新思考,如果你在这里做正确的事情。为什么不能对t使用非const引用,或者返回const引用?