2 Stimmen

Behälter von Zeigern

Ich habe Probleme beim Deklarieren eines STL-Sets von Zeigern auf Klasseninstanzen. Genauer gesagt habe ich dieses Szenario:

class SimulatedDiskFile {
  private:
    // ...
  public:
    // ...
    struct comparator {
      bool operator () (SimulatedDiskFile* const& file_1, SimulatedDiskFile* const& file_2) {
        return ((*file_1)->getFileName() < (*file_2)->getFileName());
      }
    };
}

typedef set FileSet;

Der obige Code funktioniert nicht. Der Compiler sagt, er habe keine Memberfunktion SimulatedDiskFile::comparator() gefunden. Wenn ich die Funktion mit dieser Deklaration (außerhalb des Structs) platziere, sagt der Compiler, er habe einen Typ erwartet.

Jetzt kommen hier meine Zweifel (nicht nur einen, aber verwandt, denke ich):

  • Was ist die richtige Deklaration für ein Set von Zeigern?
  • Was ist die richtige Deklaration für eine Vergleichsfunktion, die Zeiger vergleicht?

Ich habe viele Informationen gesucht, bevor ich gepostet habe, aber die Referenzen waren verwirrend und nicht ganz auf meinen speziellen Fall bezogen (so banal und trivial wie ich denke, dass er ist - tatsächlich ist dies vielleicht sogar die Ursache). Daher sind gute Links auch sehr hilfreich!

Vielen Dank im Voraus!

5voto

Alex Martelli Punkte 805329

Ein paar Fehler beheben,

#include 

class SimulatedDiskFile {
  public:
    int getFileName() { return 23; }

    struct comparator {
      bool operator () (SimulatedDiskFile* file_1, SimulatedDiskFile* file_2) {
        return (file_1->getFileName() < file_2->getFileName());
      }
    };
};

typedef std::set FileSet;

kompiliert einwandfrei.

1voto

goldPseudo Punkte 5331

Da Sie nicht zeigen, wo die Methode 'getFileName()' sein soll, gehe ich einfach mal davon aus, dass Sie nicht beabsichtigen, Ihre Zeiger im Vergleichsoperator doppelt zu dereferenzieren. Das heißt, Sie sollten entweder:

return (file_1->getFileName() < file_2->getFileName());

oder:

return ((*file_1).getFileName() < (*file_2).getFileName());

aber nicht beides.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X