我如何使用const函数与“this”

时间:2014-11-28 18:26:20

标签: c++ const

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函数需要返回一个三角形的区域,我找到了一个适用于每种类型三角形的公式。 _pointsstd::vector<Point>,包含带有xy参数的2D点。
我有distance()函数给我两点之间的距离。

我不知道如何以另一种方式获得三角形区域,并且该功能必须是const,视觉工作室标记第一个&#34;这个&#34;在每一行中,它给了我这个问题:

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声明的类。

1 个答案:

答案 0 :(得分:3)

至于你的澄清评论

  

&#34; distance函数不是const,但它得到一个(const&amp; Point)作为参数&#34;

Point成员函数

中出现的代码中,必须将const从矢量成员变量访问的const值视为this->_points.at(1).distance(this->_points.at(2)); // ^^^^^^^^^^^^^
std::vector::at()

请参阅area() reference documentation中的第二个签名,这个签名实际上是在Point函数中调用的。

这最终要求double distance(const Point& pt) const; // ^^^^^ 类需要声明

double Triangle::area() const

成员签名,可以从Point::distance()成员函数调用。

我认为您的Point函数不会以任何方式更改const实例,因此只需将const Triangle *const this恰当地添加到签名中即可。


  

&#34;我不知道如何以另一种方式获得三角形区域,并且该功能必须是常量,视觉工作室标记第一个&#34;这个&#34 ;在每一行中,它给了我这个问题:&#34;

     

this

进一步深入解释:

Triangle *const指针将被评估为

    const 成员函数中的
  1. const Triangle *const
  2. const代表 Triangle 成员函数
  3. 第一种形式允许修改mutable的数据成员 第二种形式否认这一点,除非相关数据成员标记为const

    两种表单(*之后出现的this)拒绝,您可以修改this = new Triangle();指针本身(例如尝试类似{{1}})