-4

我接到了家长班的电话

Shape

形状得到了 2 个孩子的电话

Square and Rectangle

Shape类有一个变量调用区,它是int类型

所以我像这样创建了一些正方形,矩形的对象

int main()
{
    Shape *shaped[100];

    //then i did some adding of object..
    int areaValue;
    areaValue=1;

    shaped[0] = new Rectangle();
    shaped[0]->setArea(areaValue);

    areaValue=7;
    shaped[1] = new Square();
    shaped[1]->setArea(areaValue);

    areaValue=5;
    shaped[2] = new Square();
    shaped[2]->setArea(areaValue);

    shapeCounter = 3;

    sort(shaped[0],shaped[2]);

    for (int i=0;i<shapeCounter;i++)
    {
        cout << shaped[i].getArea() << endl;
    }

}

我尝试按升序排序,但它不起作用。没有位置变化,区域仍然是相同的顺序。

感谢大家的帮助!

更新:

我在 Shape.cpp 做了以下更改

 bool Shape::orderByArea(const Shape* lhs, const shape* rhs)
    {
      return lhs->area() < rhs->area();
    }

然后在 main.cpp 我做了这个

std::sort(shaped, shaped + 3, orderByArea);

但是我得到一个错误,orderByArea 没有在这个范围内声明。

我尝试的另一件事是: 使用向量进行排序

在 Shape.h

public:

bool operator<const Shape& x) const
{
return area < x.area;
}

在 main.cpp

vector<ShapeTwoD*> sortVector;
sortVector.clear();
sortVector.assign(shaped,shaped + shapeCounter);

sort(sortVector.begin(),sortVector.end());

for(int i=0;i<shapeCounter;i++)
{
cout << sortVector[i].toDisplay() << endl;
}

但似乎没有任何问题。我试着做一个打印输出它的位置是一样的。

更新:现在已修复。排序正在工作。感谢专家!

我还有一个问题是

形状 *shape[100];

我如何复制的值

Shape *shaped[100];

进入

vector<Shape> myVector;

代替

vector<Shape*> myVector;

所以我可以使用普通的对象排序。

4

2 回答 2

4

在您的代码中,您如何期望编译器知道您想按区域排序,魔术?我建议阅读有关标准 C++ 库(又名 STL)的书,它将解释如何进行自定义排序。在您的代码中,您有一个指针数组,因此您应该编写一个可以对指针进行排序的仿函数。您的 std::sort 参数也是错误的。您的数组开始于shaped,结束于shaped + 3(因为您的数组中有三个元素)。

struct sort_by_area
{
    static bool operator()(Shape* x, Shape* y)
    {
        return x->getArea() < y->getArea();
    }
};

sort(shaped, shaped + 3, sort_by_area());

未经测试的代码,为任何错误道歉。

或者您可以使用 juanchopanza 所说的函数指针。

于 2012-11-03T09:20:49.333 回答
1

shapes假设你有一个充满Shape*, 并且Shape有一个方法的数组int getArea() const;,你需要定义一个小于比较逻辑,然后告诉std::sort使用它。您可以通过定义这种小于函数来实现前者:

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

然后调用std::sort,传递一个指向函数的指针:

#include <algorithm>

Shape* shapes[3] = ....; // array of three pointers to Shape
std::sort(shapes, shapes + 3, orderByArea);
于 2012-11-03T09:22:12.450 回答