Article View: be.comp.programming
Article #12303Re: C++ functieobjecten als comparator in STL
From: Goethals Frederik
Date: Sat, 08 Dec 2001 11:37
Date: Sat, 08 Dec 2001 11:37
147 lines
6189 bytes
6189 bytes
"Roel Schroeven" <x3jmyi0yrrn3h001@sneakemail.com> schreef in bericht
news:pan.2001.12.08.11.20.09.51.957@sneakemail.com...
> On Sat, 08 Dec 2001 10:19:07 +0100, Goethals Frederik wrote:
>
> > Elk Event (dus ook de afgeleide events) hebben een 'int time' als
> > protected member en een public 'int geefTime() const {return time; }'
> > als methode. Nu wou ik dus de Event* vergelijken en had bij constructie
> > van de priority_queue het volgende gedaan: priority_queue <Event*,
> > deque<Event*>, less<Event*> > p;
> >
> > ik heb dan in elke afgeleide klassen de operator< (....)
> > geimplementeerd. (heb dan ook telkens wanneer hij event* vergelijkt een
> > cout << "vgl" bijgezt als controle) Maar het probleem is dus dat hij
> > nooit in de functie operator< (...) komt en dus geen "vgl" uitprint.
>
> Voor het geval je het nog niet doorhad, even uitleggen waarom dat niet
> werkt: STL vergelijkt de elementen die in de priority_queue staan, en dat
> zijn de pointers zelf in plaats van de objecten waar ze naar wijzen.
>
> > Nu
> > heb ik al enige raad en info gehad van de assistent (ben namelijk
> > student aan de unief en we moeten allen dat project proberen maken) dat
> > daar de fout zit en dat ik zelf een functieobject moet implementeren dat
> > twee 'event*' vergelijk en dan megeven als comparator obejct aan de
> > queue.
>
> Hij heeft gelijk ;)
>
> > Nu komt dus de vraag: hoe moet ik die functie implementeren en wat is de
> > syntax van die functie en waar moet die staan (in klasse event, afgelide
> > klassen, erbuit, apart file ....?) ik weet het dus echt niet en het is
> > het enige die niet werkt van mijn project.
>
> Je moet een functie-object maken dat twee Event* als input neemt, en een
> bool teruggeeft. Zulke functie-objecten leidt je best af van het
> functie-object binary-function (in <functional>).
> Een voorbeeldje dat ik gehaald heb van
> http://www.sgi.com/tech/stl/functors.html, om twee doubles te
> vergelijken:
>
> struct less_mag : public binary_function<double, double, bool> {
> bool operator()(double x, double y) { return fabs(x) < fabs(y); }
> };
>
> Bij zal je die double moeten vervangen door Event*, en hoe die te
> vergelijken kan je zelf wel uitvissen ;)
>
> Waar die te zetten... ik zou dat zetten in de header file waar Event
> gedefinieerd is, maar buiten die klasse (erna, best).
>
> Nog een opmerking: je zegt dat je operator< geimplementeerd hebt in alle
> afgeleide klassen, maar ik denk dat het genoeg is als je dat in de
> basisklasse doet, zeker als je de vergelijking doet op basis van
> geefTime(), die is toch voor alle afgeleide klassen hetzelfde als ik me
> niet vergis.
>
> Nog iets... ik ken dit ook allemaal niet zo goed van buiten, ik moet ook
> altijd teruggrijpen naar de documentatie (The C++ Programming Language
> van Bjarne Stroustrup himself, in dit geval; een aanrader als je het
> onderste uit de kan wil halen qua C++).
Ik blijf dus problemen hebben, heb hieronder stuk van de code gezet:
######### in de file event.h ##########
#ifndef EVENT_H
#define EVENT_H
#include <string>
#include <vector>
#include <iostream>
#include <functional>
class Event {
protected:
string naam; //naam van event.
int time; //tijd dat event optreedt
public:
Event(); //eigenlijk deze constructor niet mogen gebruiken.
Event(string n, int ti)
: naam(n), time(ti) {}
string& geefNaam(); //{ return naam; }
virtual int geefTime() const = 0;// virtuele functie ==> wortd in
afgeleide object: return time;
}; // rinde van class Event
struct less_event : public binary_function<Event*, Event*, bool> {
bool operator()(Event* x, Event* y) {
return x->geefTime() < y->geefTime();
}
};// einde van de struct.
#endif
######### in de file scheduler.h ##########
#ifndef SHEDULER_H
#define SHEDULER_H
#include "event.h"
class Event; // was nodig anders kende hij de klasse Event niet ???
#include <vector>
#include <queue>
#include <functional>
class Sheduler {
protected:
int aantalEvents;
int maxAantalEvents;
string naam;
int clock;
//priority_queue <Event*, deque<Event*>, less<Event*> > p; //werkte
niet.
priority_queue <Event*, deque<Event*>, less_event() > p;
public:
....
};
#################################
als error messages krijg ik dan: (deze errors meerder keren)
error C2974: 'priority_queue' : invalid template argument for '_Pr', type
expected
'p' uses undefined class 'priority_queue<class Event *,class
std::deque<class Event *,class std::allocator<class Event *> >,int>'
error C2065: 'less_event' : undeclared identifier
error C2955: 'priority_queue' : use of class template requires template
argument list
c:\program files\microsoft visual studio\vc98\include\queue(96) :
see declaration of 'priority_queue'
ik versta er mij nu niet meer aan, de help van msdn maakt me ook niet veel
duidelijker wat de errors juist zijn en zeker niet hoe ze op te lossen.
Ik weet niet of er iemand mij kan helpen ???? Please ????
Bedankt.
Goethals Frederik.
Technical Details
Message-ID:
<3c11fb33$0$27946$ba620e4c@news.skynet.be>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!news.tele.dk!small.news.tele.dk!195.238.2.15!skynet.be!skynet.be!louie!not-for-mailReferences:
<3c11dae3$0$27949$ba620e4c@news.skynet.be> <pan.2001.12.08.11.20.09.51.957@sneakemail.com>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: fcea4,fc347145cf14adb4 X-Google-Attributes: gidfcea4,public X-Google-ArrivalTime: 2001-12-08 03:36:46 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!news.tele.dk!small.news.tele.dk!195.238.2.15!skynet.be!skynet.be!louie!not-for-mail From: "Goethals Frederik" <frederik.goethals@belgacom.net> Newsgroups: be.comp.programming References: <3c11dae3$0$27949$ba620e4c@news.skynet.be> <pan.2001.12.08.11.20.09.51.957@sneakemail.com> Subject: Re: C++ functieobjecten als comparator in STL Date: Sat, 8 Dec 2001 12:37:00 +0100 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 Lines: 150 Message-ID: <3c11fb33$0$27946$ba620e4c@news.skynet.be> Organization: -= Skynet Usenet Service =- NNTP-Posting-Host: 217.136.88.56 X-Trace: 1007811381 reader0.news.skynet.be 27946 217.136.88.56 X-Complaints-To: abuse@skynet.be