0
Info:
Parent Class: Vehicle
Child Class : Car & Lorry

我有一个向量,我试图按升序对其进行排序

排序(myVector.begin(),myVector.end(),compareByArea);

所以在 Vehicle.h

我做了

class VehicleTwoD
{
private:
//some variable
public:
bool compareByArea(const VehicleTwoD,const VehicleTwoD);
}

在 Vehicle.cpp 我做到了

bool VehicleTwoD::compareByArea(const VehicleTwoD &a,const VehicleTwoD &b)
{
return a.getArea() < b.getArea();
}

错误是 VehicleTwoD 没有名为 getArea 的成员。

它位于我的孩子 Car & Lorry 和双区也申报在孩子。

但问题是如果我想通过这种方式排序,我可以通过使用 virtual 来实现它,然后我在 child 处创建相同的方法,但重载它并通过这种方式让我的区域排序

有没有更好的方法来做到这一点。

感谢大家的帮助!

Additional Info:

我在 Car & Lorry 有这个 getArea() 函数,这只是一个简单的

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

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

但是现在当我在向量中得到一个对象列表时,它们每个都是不同类的孩子。但是都有getArea函数,我想对这个向量进行排序

sortVector.assign(vehicletwod, vehicletwod + arrayCounter);
sort(sortVector.begin(),sortVector.end(),compareArea);

//但是排序不起作用。

我不知道在哪里创建可以 getArea() 的对象 1 与对象 2 并返回 bool 结果的 compareArea;

我尝试使用它在 VehicleTwoD 中创建它

bool VehicleTwoD::compareByArea(const VehicleTwoD &a,const VehicleTwoD &b)
{
return a.getArea() < b.getArea();
}

但问题是 VehicleTwoD 没有函数 getArea,它们位于 child。我应该如何得到这个修复。谢谢..

感谢帮助:

我尝试了以下

template<typename T> bool compareByArea(const T &a, const T &b) {
    return a.getArea() < b.getArea();
}

我也在.h文件中声明它,

public:
template<typename T>
bool compareByArea(const T,const T);
virtual double getArea();

然后在我的 main.cpp 我试过了

sortVector.assign(vehicletwod, vehicletwod + arrayCounter);
sort(sortVector.begin(),sortVector.end(),sortVector[0].compareArea);

它给了我一个错误

sortVector.std::vector<_TP, _ALLOC ....... 中的成员 compareByArea 的错误请求是非类类型“VehicleTwoD*”

如果我这样做

  sortVector.assign(vehicletwod, vehicletwod + arrayCounter);
  sort(sortVector.begin(),sortVector.end(),sortVector[0].compareArea);

我会得到错误 compareByArea 没有在这个范围内声明。

我该怎么办?我在包含在 main.cpp 中的 VehicleTwoD 声明了 compareByArea

VehicleTwoD 是父类,我也是 virtual double getArea() 所以当它调用 getArea 时,它将使用子 getArea 代替,因为私有变量 - area 在 child 并且函数 getArea() return area 也在 child

我该怎么办..困惑和卡住。谢谢!

最新更新再次:

我正在尝试通过 compareByArea 对向量进行排序,其中较小的区域将在最高处排序,而较大的 1 将在底部。

问题是 getArea 是 Car & Lorry (子类)的函数,我在 main.cpp 创建了这个 compareByArea

sortVector 是 vehicletwod 的向量副本

我为我的车辆设定价值的方式是这样的..

if(vehicleType=="Car")
{
vehicletwod[arrayCount] = new Car();
vehicletwod[arrayCount].setDimension();
//set area
vehicletwod[arrayCount].setArea();
cout << "Done setting the data";
}

我如何实现按区域升序排序。

我在 main.cpp 创建了这个函数

template<typename T> bool compareByArea(const T &a, const T &b) {
    return a.getArea() < b.getArea();
}

然后我做了这个

sortVector.assign(vehicletwod, vehicletwod + arrayCounter);
sort(sortVector.begin(),sortVector.end(),compareByArea);

编译错误: 编译错误:

no matching function for call to 'sort(std::vector<VehicleTwoD*>::iterator, std::vector<VehicleTwoD*>::iterator, <unresolved overloaded function type>)'

note: template<class _RAIter> void std::sort (_RAIter, _RAIter)
note: template<class _RAIter, class _Compare> void std::sort(_RAiter, _RAIter, _Compare)

谢谢

我有一个新的编译错误

error: passing 'const VehicleTwoD' as 'this' argument of 'virtual double VehicleTwoD::getArea()' discards qualifers.
error: passing 'const VehicleTwoD' as 'this' argument of 'virtual double VehicleTwoD::getArea()' discards qualifers.

关于我的 getArea 是这样的

//在父母是这样的

double VehicleTwoD::getArea()
{
double area;
area=0.00;
return area;
}

汽车 - 孩子是

 double Car::getArea()
    {
    return area;
    }
4

2 回答 2

3

如果VehicleTwoD::getArea是公共的,那么最简单的方法是创建compareByArea一个自由函数而不是一个方法VehicleTwoD

bool compareByArea(const VehicleTwoD &a,const VehicleTwoD &b) {
  return a.getArea() < b.getArea();
}

然后你可以很容易地通过使用它进行排序:

std::sort(myVector.begin(), myVector.end(), compareByArea);

在 C++11 中,您可以使用 lambda 表达式:

std::sort(std::begin(myVector), std::end(MyVector),
          [](const VehicleTwoD &a, const VehicleTwoD &b) {
            return a.getArea() < b.getArea();
          });

如果getArea不是公共的,您仍然可以将compareByArea其用作自由函数,但将其声明为类的朋友。

更新:一个完整​​的工作示例:

#include <algorithm>
#include <iostream>
#include <vector>

class VehicleTwoD {
  public:
    VehicleTwoD(double area) : m_area(area) {}
    double getArea() const { return m_area; }
  private:
    double m_area;
};

bool compareByArea(const VehicleTwoD &a,const VehicleTwoD &b) {
  return a.getArea() < b.getArea();
}

int main() {
  std::vector<VehicleTwoD> vehicles;
  vehicles.push_back(VehicleTwoD(3.0));
  vehicles.push_back(VehicleTwoD(1.0));
  vehicles.push_back(VehicleTwoD(2.0));
  std::sort(vehicles.begin(), vehicles.end(), compareByArea);
  for (auto it = vehicles.begin(); it != vehicles.end(); ++it) {
    std::cout << it->getArea() << std::endl;
  }
  return 0;
}
于 2012-10-30T18:33:11.783 回答
2

制作模板函数:

template<typename T> bool compareByArea(const T *a, const T *b) {
    return a->getArea() < b->getArea();
}

然后你可以将它传递给排序:

sort(sortVector.begin(), sortVector.end(), compareByArea<VehicleTwoD>);

更新:

车辆.h:

class VehicleTwoD {
...
public:
    virtual double getArea() const;
};

template<typename T> bool compareByArea(const T *a, const T *b) {
    return a->getArea() < b->getArea();
}

主.cpp:

#include "Vehicle.h"
#include <vector>
...
std::vector<VehicleTwoD*> sortVector;
// fill sortVector
sort(sortVector.begin(), sortVector.end(), compareByArea<VehicleTwoD>);
...
于 2012-10-30T18:59:21.410 回答