double Triangle::area() const
{
double a = this->_points.at(0).distance(this->_points.at(1));
double b = this->_points.at(1).distance(this->_points.at(2));
double c = this->_points.at(2).distance(this->_points.at(0));
return ((sqrt((a + b + c)*(a + b - c)*(a - b + c)*(-a + b + c))) / (2*c));
}
我有这个需要返回三角形面积的 const 函数,我找到了一个适用于每种三角形的公式。 _points
是一个包含具有x
和y
参数的 2D 点的std::vector<Point>
。
我有一个distance()
函数,可以给我两点之间的距离。
我不知道如何以另一种方式获取三角形的面积,函数必须是常量,视觉工作室在每行中标记第一个"this",它给了我这个问题:
const Triangle *const this
Error: the object has type qualifiers that are not compatible with the member function
object type is: const Point
Point
是具有distance()
函数以及x
和y
声明的类。
至于你的澄清评论
"
distance
函数不是常量,但它得到一个(常量和点(作为参数">
从向量成员变量访问的Point
值必须const
出现在 const
成员函数中的代码中考虑
this->_points.at(1).distance(this->_points.at(2));
// ^^^^^^^^^^^^^
请参阅std::vector::at()
参考文档中的第二个签名,这个签名实际上是在您的area()
函数中调用的。
这最终要求Point
类需要声明一个
double distance(const Point& pt) const;
// ^^^^^
成员签名,可以从double Triangle::area() const
成员函数调用它。
我想您的Point::distance()
函数不会以任何方式更改Point
实例,因此完全可以,只需适当地将const
添加到签名中即可。
">我不知道如何以另一种方式获取三角形的面积,函数必须是恒常的,视觉工作室在每行中标记了第一个"this",它给了我这个问题:">
const Triangle *const this
为了更深入地解释:
this
指针的计算结果为
- 非
const
成员函数中的Triangle *const
-
const
成员函数的const Triangle *const
第一种形式允许修改Triangle
的数据成员。
第 2 种形式否认这一点,除非有问题的数据成员被标记为 mutable
。
两种形式(*
后面出现的const
(都拒绝,您可以修改this
指针本身(例如尝试类似this = new Triangle();