Info:
Parent Class: Vehicle
Child Class : Car & Lorry
I got a vector and i trying to sort it by ascending area
sort(myVector.begin(),myVector.end(),compareByArea);
so at the Vehicle.h
I did
class VehicleTwoD
{
private:
//some variable
public:
bool compareByArea(const VehicleTwoD,const VehicleTwoD);
}
and at Vehicle.cpp i did this
bool VehicleTwoD::compareByArea(const VehicleTwoD &a,const VehicleTwoD &b)
{
return a.getArea() < b.getArea();
}
Error was VehicleTwoD has no member named getArea.
It is located in my child Car & Lorry and double area is also declare in the child .
But the issue is if i want to sort by this way, could i achieve it by using virtual and then I create the same method at child but overload it and get my area sort by that way
Is there a better way to do it .
Thanks for all help!
Additional Info:
I have this getArea() function at Car & Lorry which is just a simple
double Car::getArea()
{ return area;}
double Lorry::getArea()
{ return area;}
But now as i got a list of object in my vector, each of them is a child of different class. but all got getArea function, i want to sort this vector which is
sortVector.assign(vehicletwod, vehicletwod + arrayCounter);
sort(sortVector.begin(),sortVector.end(),compareArea);
//but the sort doesnt work.
I don’t know where to create compareArea which can getArea() of object 1 against object 2 and return bool result;
I try to create it in VehicleTwoD using this
bool VehicleTwoD::compareByArea(const VehicleTwoD &a,const VehicleTwoD &b)
{
return a.getArea() < b.getArea();
}
But the issue is VehicleTwoD don’t have the function getArea, they are located at child. how should i get this fix . Thanks..
Thanks to the help:
I tried the following
template<typename T> bool compareByArea(const T &a, const T &b) {
return a.getArea() < b.getArea();
}
and i declare it at the .h file too,
public:
template<typename T>
bool compareByArea(const T,const T);
virtual double getArea();
then at my main.cpp i tried
sortVector.assign(vehicletwod, vehicletwod + arrayCounter);
sort(sortVector.begin(),sortVector.end(),sortVector[0].compareArea);
It give me an error
error request for member compareByArea in sortVector.std::vector<_TP, _ALLOC ……. which is of non class type ‘VehicleTwoD*’
If i do this
sortVector.assign(vehicletwod, vehicletwod + arrayCounter);
sort(sortVector.begin(),sortVector.end(),sortVector[0].compareArea);
I will get error compareByArea was not declared in this scope.
What should i do? I declared compareByArea at VehicleTwoD which is included in main.cpp
VehicleTwoD is the parent class, and i also virtual double getArea() so when it call getArea it will use the child getArea instead, because the private variable – area is at child and the function getArea() return area is also at child
What should i do.. confused & stuck.
Thanks!
Latest Update Again:
I am trying to sort the vector by compareByArea which the smaller area will be sort at the highest while the bigger 1 will be at bottom.
The problem is getArea is a function of Car & Lorry (child class) and i create this compareByArea at main.cpp
sortVector is a vector copy of vehicletwod
The way i set value into my vehicletwod is this way..
if(vehicleType=="Car")
{
vehicletwod[arrayCount] = new Car();
vehicletwod[arrayCount].setDimension();
//set area
vehicletwod[arrayCount].setArea();
cout << "Done setting the data";
}
How do i achieve my sorting by area ascending.
I created this function at main.cpp
template<typename T> bool compareByArea(const T &a, const T &b) {
return a.getArea() < b.getArea();
}
then i did this
sortVector.assign(vehicletwod, vehicletwod + arrayCounter);
sort(sortVector.begin(),sortVector.end(),compareByArea);
Compile Error:
Compile error:
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)
Thanks
I got a new compile error
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.
Regarding my getArea is this
//in parent is this way
double VehicleTwoD::getArea()
{
double area;
area=0.00;
return area;
}
Car – Child is
double Car::getArea()
{
return area;
}
Make a template function:
then you can pass it to sort:
Update:
Vehicle.h:
main.cpp: