如何修改 [Error] passing 'const Student' as 'this' argument of 'double Student::average_score()' discards qualifiers [-fpermissive]
时间: 2023-12-17 19:05:56 浏览: 137
这个错误提示是因为 `average_score()` 函数没有加上 `const` 修饰符,而在 `operator>` 函数的实现中,使用了 `average_score()` 函数来获取当前对象的平均成绩,但是在 `operator>` 函数中,`this` 指针被隐式地转换为了 `const Student*`,因此编译器认为 `average_score()` 函数可能会修改 `this` 指针所指向的对象,导致了这个错误。
要修复这个错误,可以在 `average_score()` 函数定义中加上 `const` 修饰符,表示该函数不会修改对象的内容:
```
double average_score() const {
int sum = 0;
for (int i = 0; i < 6; i++) {
sum = sum + scores[i];
}
average = sum / 6.0;
return average;
}
```
这样就可以避免这个错误了。
相关问题
153 27 C:\Users\ASUS\Desktop\papers\c++\CLionProjects\week_15\date.cpp [Error] passing 'const Date' as 'this' argument of 'bool Date::is_valid()' discards qualifiers [-fpermissive]
这个错误是因为 `is_valid()` 函数没有被声明为 const 函数。在重载运算符 `<<` 的时候,我们将 `Date` 对象声明为了 `const Date&` 形式,这就意味着不能修改这个对象的状态,所以调用的成员函数也必须是 const 函数。
因此,我们只需要在 `is_valid()` 函数的声明中加上 `const` 关键字即可:
```cpp
bool is_valid() const {
// ...
}
```
修改后的代码如下:
```cpp
#include <iostream>
using namespace std;
class Date {
private:
int year, month, day;
public:
Date(int y = 1970, int m = 1, int d = 1) {
year = y;
month = m;
day = d;
}
bool is_valid() const {
if (year < 1970 || year > 9999 || month < 1 || month > 12 || day < 1 || day > 31) {
return false;
}
if (month == 2) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
if (day > 29) {
return false;
}
} else {
if (day > 28) {
return false;
}
}
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
if (day > 30) {
return false;
}
}
return true;
}
friend ostream& operator<< (ostream& os, const Date& date) {
if (date.is_valid()) {
os << date.year << "-" << date.month << "-" << date.day;
} else {
os << "Invalid date";
}
return os;
}
};
int main() {
Date a(2021, 10, 31);
cout << "当前日期已设置为:" << a << endl;
return 0;
}
```
这样就可以通过编译了。
passing ‘const Shape’ as ‘this’ argument of ‘virtual double Shape::Area()’ discards qualifiers
这个错误信息意味着你正在尝试在一个常量对象上调用一个非常量函数。换句话说,你正在尝试修改一个被声明为常量的对象。在这种情况下,编译器会拒绝这个操作并显示上述错误信息。
要解决这个问题,你需要使用 `const` 关键字来修饰函数,表示这个函数不会修改对象的状态。例如,如果你有一个名为 `Area()` 的函数,你可以将它声明为 `const` 函数:
```
double Area() const;
```
这样一来,即使你在一个常量对象上调用 `Area()` 函数,编译器也不会报错,因为它知道这个函数不会修改对象的状态。
阅读全文