Re: Operater < overloading for struct problem
On Mar 1, 10:45 am, "Frank" <f.f.nee...@gmail.com> wrote:
Hello everyone,
I am having trouble overloading the < operator for an assignment. I
use a struct that contains information and I would like to sort this
structure using STL sort with my own criteria of sorting. Basically, I
would like to sort on visitor count of the Attraction structure.
However, it never uses the < overloaded operator with my code.
Handler.h:
#ifndef H_HANDLER //Guard
#define H_HANDLER
#include <iostream>
#include <vector>
using namespace std;
struct Attraction {
string name;
int visitors;
};
class Handler { //Define the class Handler
private:
vector<Attraction*> attractions ;
vector<Attraction*>::iterator p ;
public: //Public functions
~Handler();
void addAttraction(string name, int visitors);
void printAttractions();
};
#endif
and in the Handler.cpp I have:
Handler.cpp - snippet:
bool operator<(const Attraction& a,const Attraction& b){
return a.visitors < b.visitors;
}
Here is the function that performs the sort after adding a value:
void Handler::addAttraction(string name, int visitors){
Attraction *attr;
attr=new Attraction();
attr->name=name;
attr->visitors=visitors;
attractions.push_back(attr);
sort(attractions.begin(),attractions.end());
}
However, whatever I do, it will never use the overloaded < operator
for sorting. What am I doing wrong? If I add the overloaded function
in the header it starts complaining because it will also be inserted
into the main program which is confusing since I have a guard around
the header file.
I suspect the fundamental problem is that you are sorting pointers
rather than objects. In other words, std::sort works on the value_type
of the container, which in your case is Attraction*, not Attraction.
So, do you need to operator on the Attraction object polymorphically?
If not, don't use pointers; just allocate it on the stack, and let
vector make a copy (assuming attractions is now of type
vector<Attraction>:
void Handler::addAttraction( const string& name, const int visitors )
{
const Attraction attr = { name, visitors };
attractions.push_back(attr);
sort(attractions.begin(),attractions.end());
}
Note also that I changed the function parameters to const (see
http://www.parashift.com/c++-faq-lite/const-correctness.html) and the
string to a reference so it doesn't make an additional copy (see
http://www.parashift.com/c++-faq-lite/references.html).
If you do need to use it polymorphically and to store it in a vector,
prefer smart pointers such as std::tr1::shared_ptr (aka
boost::shared_ptr) or one of the smart pointers found in this FAQ and
those following:
http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.22
BTW, you could put just the function prototype for your operator< in
the header or you could declare it "inline" to get rid of the
duplication problem.
Cheers! --M