gpt4 book ai didi

c++ - 我如何使用 C++ STL Sort 对具有继承的对象数组进行排序

转载 作者:行者123 更新时间:2023-11-28 02:24:22 25 4
gpt4 key购买 nike

我尝试使用 C++ STL sort() 对一组对象按其属性之一进行排序,但我总是遇到错误:

main.cpp: In function 'bool sortByArea(const Shape*, const Shape*)':
main.cpp:54:22: error: passing 'const Shape' as 'this' argument of 'double Shape::getArea()' discards qualifiers [-fpermissive]
return lhs->getArea() < rhs->getArea();
^
main.cpp:54:39: error: passing 'const Shape' as 'this' argument of 'double Shape::getArea()' discards qualifiers [-fpermissive]
return lhs->getArea() < rhs->getArea();

这是我的代码:

形状.cpp

#include "Shape.h"

Shape::Shape(){
width=0;
height=0;
area=0;
perimeter=0;
}

Shape::Shape(double newwidth, double newheight, double newarea, double newperimeter){
width=newwidth;
height=newheight;
area=newarea;
perimeter=newperimeter;
}

Shape::~Shape(){

}

double Shape::getWidth(){
return width;
}

double Shape::getHeight(){
return height;
}

double Shape::getArea(){
return area;
}

double Shape::getPerimeter(){
return perimeter;
}

double Shape::calArea(){
return 0;
}

double Shape::calPerimeter(){
return 0;
}

圆.cpp

#include "Circle.h"
#include <cmath>
#define PI 3.141592654

Circle::Circle(){
width = height = 0;
area=0; perimeter=0;
}

Circle::Circle(double newradius){
width = height = newradius;
area = calArea(); perimeter = calPerimeter();
}

Circle::~Circle(){

}

double Circle::calArea(){
return (pow(width,2)*PI);
}

double Circle::calPerimeter(){
return (width * PI * 2);
}

主要.cpp

#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"
#include "Square.h"
#include <fstream>
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;
const int size = 200;
int cshape = 0; int rshape = 0; int sshape = 0;

void input_circle(Shape* mshape){
ifstream file;
int i;
double r;
file.open("circle.txt");
while (file >> r){
Circle crl(r);
mshape[cshape]=crl;
cshape++;
}
file.close();
}

bool sortByArea(const Shape * lhs, const Shape * rhs) {
return lhs->getArea() < rhs->getArea();
}


int main(){
Shape* shapecir;
shapecir = new (nothrow) Circle[size]();
input_circle(shapecir);
int i;
cout << "Circle" << endl;
sort(shapecir,shapecir+size,sortByArea);
for (i=0;i<cshape;i++)
cout << shapecir[i].getArea() << " " << shapecir[i].getPerimeter() << endl;
return 0;
}

我试图在 Internet 上找到一些东西,但找不到任何有用的东西。

最佳答案

您应该在编写这些函数时对其进行测试。问题出在这里:

double Shape::getArea(){
return area;
}

bool sortByArea(const Shape * lhs, const Shape * rhs) {
return lhs->getArea() < rhs->getArea();
}

您正确地为 sortByArea 提供了常量指针参数,但忽略了使 getArea 成为常量函数。编译器告诉您,在您禁止更改形状之后,您正在命令代码执行可能更改形状的操作。

关于c++ - 我如何使用 C++ STL Sort 对具有继承的对象数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31236375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com