C++ 如何将常量函数与“一起使用?”;这";

C++ 如何将常量函数与“一起使用?”;这";,c++,constants,C++,Constants,我有一个常量函数,需要返回三角形的面积,我找到了一个公式,适用于所有类型的三角形。 \u点是一个std::vector,它包含带有x和y参数的二维点。 我有一个distance()函数,它给出两点之间的距离 我不知道如何以另一种方式获得三角形的面积,函数必须是const,visual studio在每行中标记第一个“this”,这给了我一个问题: double Triangle::area() const { double a = this->_points.at(0).dista

我有一个常量函数,需要返回三角形的面积,我找到了一个公式,适用于所有类型的三角形。
\u点
是一个
std::vector
,它包含带有
x
y
参数的二维点。
我有一个
distance()
函数,它给出两点之间的距离

我不知道如何以另一种方式获得三角形的面积,函数必须是const,visual studio在每行中标记第一个“this”,这给了我一个问题:

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));
}

Point
是具有
distance()
函数和
x
y
声明的类,用于澄清注释

“distance函数不是常量,但它获取一个(常量和点)作为参数”

从向量成员变量访问的
值必须在出现在
const
成员函数内的代码中考虑
const

const Triangle *const this
Error: the object has type qualifiers that are not compatible with the member function
       object type is: const Point
请参见
std::vector::at()
中的第二个签名,这个签名实际上是在
area()函数中调用的

这最后要求
类需要声明

this->_points.at(1).distance(this->_points.at(2));
   // ^^^^^^^^^^^^^
可以从
double Triangle::area()const
成员函数调用的成员签名

我假设您的
Point::distance()
函数不会以任何方式更改
Point
实例,因此只要将
const
适当地添加到签名中就可以了


“我不知道如何以另一种方式获得三角形的面积,函数必须是const,visual studio在每行中标记第一个“this”,这就给了我这个问题:”

const三角形*const此

更深入地解释一下:

指针将被计算为

  • 三角形*常量
    常量
    成员函数中
  • const三角形*const
    用于
    const
    成员函数
  • 第一个表单允许修改
    三角形的数据成员

    第二个表单否认这一点,除非相关数据成员被标记为
    mutable


    这两种形式(出现在
    *
    之后的
    常量)都拒绝您可以修改
    指针本身(例如,尝试类似
    此=新三角形();

    也许您的
    点::距离
    函数不是
    常量
    。此->运算符用于引用在类的私有部分中定位/初始化的变量/函数。@Bot,您的语句不仅不相关,而且也不正确。lol@Bot“…参考类的私有部分中的变量/函数”这是胡说八道!距离函数不是常数,但它得到一个(常数&点)作为参数
    double distance(const Point& pt) const;
                                  // ^^^^^