Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » [STL] Problem mit priority_queue

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.06.2005, 11:58 Uhr
~knut
Gast


Hallo!

Ich moechte innerhalb einer Methode gerne eine "priority_queue" mit Objekten einer anderen Klasse fuellen:


C++:
// Datenklasse
class MyData
{
public:
    MyData();
    operator< (const MyData& x) { return prio < x.prio; }

private:
    int prio;
};



Nun muss ich ja aber in der Methode __Zeiger__ auf diese Objekte einfuegen, damit ich spaeter wieder darauf zugreifen kann:


C++:
class Applikation
{
    void fuelleQueue();
    // ...
};

Applikation::fuelleQueue()
{
    priority_queue< MyData* > pq;

    // Daten ermitteln und Objekt erstellen...
    MyData* temp = new MyData();
  
    // In Queue einfuegen
    pq.push(temp);
}



Das funktioniert auch alles soweit ganz gut, ich kann dann in einer anderen Methode der Klasse "Applikation" ueber die Zeiger wieder an die Objekte kommen.

Nun zum eigentlichen Problem: Wenn ich vorgehe wie oben beschrieben, wird der "operator<" nicht verwendet!

Wenn ich meine Queue hingegen in dieser Art befuelle, werden die Datensaetze korrekt sortiert ("operator<" wird aufgerufen):


C++:
Applikation::fuelleQueue()
{
    priority_queue< MyData > pq;

    // Daten ermitteln und Objekt erstellen...
    MyData temp();
  
    // In Queue einfuegen
    pq.push(temp);



Allerdings sind die lokalen Objekte dann nach dem Ende der Methode verloren!
Irgendwie muss ich sicherlich den "operator<" abaendern ... aber leider fehlt mir hier das fundierte Wissen ueber Zeigen/Referenzen etc. in C++ ... ;(

Danke fuer eure Hilfe!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.06.2005, 14:23 Uhr
doppler



Die priority_queue<..> pq ist in beiden Fällen ein lokales Objekt. Das heißt, wenn fuelleQueue() verlassen wird, wird der Destruktor für pq aufgerufen. Im zweiten Fall sind außerdem die temp-Objekte lokal und werden bei Verlassen der Funktion zerstört. Im ersten Fall umgehst du das, indem du sie mit new erzeugst (alle Objekte, die mit new erzeugt werden, müssen mit delete zerstört werden.

Um die Probleme zu lösen, solltest du an die Funktion eine Referenz oder einen Zeiger auf eine priority_queue übergeben:

C++:
Applikation::fuelleQueue(priority_queue< MyData >& pq)
{
    // Daten ermitteln und Objekt erstellen...
    MyData temp();
  
    // In Queue einfuegen
    pq.push(temp);
}



Auf die Daten in pq kannst du dann auch außerhalb der Funktion zugreifen.

Zu beachten ist auch, dass andernfalls zwar eine priority_queue gefüllt wird, diese aber nicht außerhalb der Funktion zur Verfügung steht.

Dass im ersten Fall nicht der neue Operator < benutzt wird, ist klar, da du ja keine Objekte vom Typ MyData vergleichst, sondern Zeiger vom Typ MyData*. Die haben einen eigenen < Operator und ich glaube nicht, dass man den überladen kann.

Dieser Post wurde am 16.06.2005 um 14:24 Uhr von doppler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: