c++ 初始值设定项列表和此指针因编译错误而卡住

zujrkrfu  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(136)

我这里有一个非常简单的代码,其中有一个Rectangle和Circle类继承自Shape类,并输出它们的面积和周长。我不明白为什么它没有编译。错误消息如下
错误:在“this”之前需要标识符矩形(浮动宽度、浮动高度):this-〉width(宽度),this-〉height(高度){}错误在“this”之前预期“{”
所以我的构造函数初始化器列表中有些东西是不正确的。在任何人建议删除“this”指针之前,我想指出我知道this指针不是强制性的,因为初始化器可以消除歧义。删除this指针编译很好,但是我想保留this指针,并想知道这里到底是什么问题。

#include <assert.h>
#include <cmath>

#define PI 3.14159

class Shape{
public:
    virtual float Area() const = 0;
    virtual float Perimeter() const = 0;
};

class Rectangle: public Shape{
public:
    Rectangle(float width, float height): this->width(width), this->height(height){}
    float Area() const{return width*height;}
    float Perimeter() const{return 2*(width+height);}
private:
    float width{0};
    float height{0};
};

class Circle: public Shape{
public:
    Circle(float radius): this->radius(radius){}
    float Area() const{return PI*radius*radius;}
    float Perimeter() const{return 2.0*PI*radius;}
private:
    float radius{0};
};

// Test in main()
int main() {
  double epsilon = 0.1; // useful for floating point equality

  // Test circle
  Circle circle(12.31);
  assert(abs(circle.Perimeter() - 77.35) < epsilon);
  assert(abs(circle.Area() - 476.06) < epsilon);

  // Test rectangle
  Rectangle rectangle(10, 6);
  assert(rectangle.Perimeter() == 32);
  assert(rectangle.Area() == 60);
}
7bsow1i6

7bsow1i61#

在任何人建议删除“this”指针之前,我想指出我知道this指针不是强制性的
你误解了这里的选项。它是强制性的而不是。初始化器命名你初始化的成员。this->width不是一个名称,而是一个表达式。
正确:Rectangle(float width, float height): width(width), height(height){}

相关问题