如何将常量函数与"this"一起使用

how can i use a const function with "this"

本文关键字:this 一起 常量 函数      更新时间:2023-10-16
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 是一个包含具有xy参数的 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()函数以及xy声明的类。

至于你的澄清评论

"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指针的计算结果为

  1. const成员函数中的Triangle *const
  2. const成员函数的const Triangle *const

第一种形式允许修改Triangle的数据成员。
第 2 种形式否认这一点,除非有问题的数据成员被标记为 mutable

两种形式(*后面出现的const(都拒绝,您可以修改this指针本身(例如尝试类似this = new Triangle();