我这里有一个非常简单的代码,其中有一个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);
}
1条答案
按热度按时间7bsow1i61#
在任何人建议删除“this”指针之前,我想指出我知道this指针不是强制性的
你误解了这里的选项。它是强制性的而不是。初始化器命名你初始化的成员。
this->width
不是一个名称,而是一个表达式。正确:
Rectangle(float width, float height): width(width), height(height){}