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

ベクトルを取得し、領域を昇順に並べ替えようとしています

sort(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にあり、ダブルエリアも子供に宣言されています。

しかし、問題は、この方法で並べ替える場合、仮想を使用してそれを達成できますか?次に、子で同じメソッドを作成しますが、それをオーバーロードして、その方法で領域を並べ替えます

それを行うためのより良い方法はありますか?

すべての助けをありがとう!

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);

//ただし、並べ替えは機能しません。

オブジェクト1のgetArea()をオブジェクト2に対してgetArea()してbool結果を返すことができるcompareAreaをどこで作成するかわかりません。

これを使ってVehicleTwoDで作成してみます

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

ただし、問題は、VehicleTwoDにgetArea関数がなく、子に配置されていることです。この修正をどのように取得する必要がありますか。ありがとう..

助けてくれてありがとう:

私は以下を試しました

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は親クラスであり、仮想ダブルgetArea()でもあるため、getAreaを呼び出すと、代わりに子getAreaが使用されます。これは、プライベート変数-areaが子にあり、関数getArea()returnareaも子にあるためです。

私は何をすべきか..混乱して立ち往生しています。ありがとう!

再び最新のアップデート:

私は、compareByAreaでベクトルを並べ替えようとしています。この場合、小さい方の領域が最も高く並べ替えられ、大きい方の領域が一番下に並べ替えられます。

問題は、getAreaがCar&Lorry(子クラス)の関数であり、main.cppでこのcompareByAreaを作成することです。

sortVectorは、vehicletwodのベクターコピーです。

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

が public の場合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 では、ラムダ式を使用できます。

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

public でない場合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>);

アップデート:

Vehicle.h:

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

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

main.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 に答える