Frage

Ich habe folgendes Funktors:

class ComparatorClass {
  public:
    bool operator () (SimulatedDiskFile * file_1, SimulatedDiskFile * file_2) {
      string file_1_name = file_1->getFileName();
      string file_2_name = file_2->getFileName();

      cout << file_1_name << " and " << file_2_name << ": ";

      if (file_1_name < file_2_name) {
        cout << "true" << endl;
        return true;
      }
      else {
        cout << "false" << endl;
        return false;
      }
    }
};

Es sollte eine strenge schwache Ordnung sein, und es ist diese lange für Debug-Zwecke (könnte nur eine Zeile sein).

Ich verwende diesen Funktor als Komparator Funktors für eine stl :: gesetzt. Problem Sein, es fügt nur das erste Element. Durch das Hinzufügen Konsolenausgabe an die Komparator-Funktion habe ich gelernt, dass es tatsächlich ist zu vergleichen den Dateinamen selbst jedes Mal .

Weitere relevante Linien sind:

typedef set<SimulatedDiskFile *, ComparatorClass> FileSet;

und

// (FileSet files_;) <- SimulatedDisk private class member
void SimulatedDisk::addFile(SimulatedDiskFile * file) {
  files_.insert(file);
  positions_calculated_ = false;
}

EDIT: der Code, ruft .addFile () ist:

current_request = all_requests.begin();
while (current_request != all_requests.end()) {
  SimulatedDiskFile temp_file(current_request->getFileName(), current_request->getResponseSize());
  disk.addFile(&temp_file);
  current_request++;
}

Wo all_requests ist eine Liste, und Klasse Antrag ist so, dass:

class Request {
  private:
    string file_name_;
    int response_code_;
    int response_size_;

  public:
    void setFileName(string file_name);
    string getFileName();
    void setResponseCode(int response_code);
    int getResponseCode();
    void setResponseSize(int response_size);
    int getResponseSize();
};

Ich wünschte, ich könnte meinen hypotesis bieten, was los ist, aber ich habe wirklich keine Ahnung. Vielen Dank im Voraus für alle Hinweise.

War es hilfreich?

Lösung

Es ist nichts falsch mit dem Code, den Sie geschrieben haben, funktionell zu sprechen. Hier ist ein komplettes Testprogramm -. Ich nur in den Lücken gefüllt habe, nicht den Code überhaupt zu ändern

#include <iostream>
#include <string>
#include <set>

using namespace std;

class SimulatedDiskFile
{
public:
    string getFileName() { return name; }

    SimulatedDiskFile(const string &n)
        : name(n) { }

    string name;
};

class ComparatorClass {
  public:
    bool operator () (SimulatedDiskFile * file_1, SimulatedDiskFile * file_2) {
      string file_1_name = file_1->getFileName();
      string file_2_name = file_2->getFileName();

      cout << file_1_name << " and " << file_2_name << ": ";

      if (file_1_name < file_2_name) {
        cout << "true" << endl;
        return true;
      }
      else {
        cout << "false" << endl;
        return false;
      }
    }
};

typedef set<SimulatedDiskFile *, ComparatorClass> FileSet;

int main()
{
    FileSet files;

    files.insert(new SimulatedDiskFile("a"));
    files.insert(new SimulatedDiskFile("z"));
    files.insert(new SimulatedDiskFile("m"));

    FileSet::iterator f;
    for (f = files.begin(); f != files.end(); f++)
        cout << (*f)->name << std::endl;

    return 0;
}

ich diese Ausgabe:

z and a: false
a and z: true
z and a: false
m and a: false
m and z: true
z and m: false
a and m: true
m and a: false
a
m
z

Beachten Sie, dass der Satz mit allen drei Dingen darin gespeichert endet und Ihr Vergleich Protokollierung zeigt vernünftiges Verhalten.

Edit:

Ihr Fehler ist in dieser Zeile:

SimulatedDiskFile temp_file(current_request->getFileName(), current_request->getResponseSize());

disk.addFile(&temp_file);

Sie nehmen die Adresse eines lokalen Objekts. Jedes Mal, um die Schleife, dass Objekt zerstört wird und das nächste Objekt wird in genau der gleichen Raum zugeordnet. Also nur das letzte Objekt existiert noch am Ende der Schleife und Sie haben mehrere Zeiger zu dem gleichen Objekt hinzugefügt. Außerhalb der Schleife, sind alle Wetten ab, weil jetzt keines der Objekte vorhanden sind.

Entweder zuweisen jedes SimulatedDiskFile mit neuen (wie in meinem Test, aber dann werden Sie haben, um herauszufinden, wann sie löschen) oder auch Zeiger nicht verwenden bei allen (viel einfacher, wenn es die Zwänge des Problems passt ).

Andere Tipps

Und hier ist das Problem:

SimulatedDiskFile temp_file(current_request->getFileName(),
                                   current_request->getResponseSize());
disk.addFile(&temp_file);

Sie fügen einen Zeiger auf eine Variable, die sofort zerstört wird. Sie müssen sich dynamisch Ihre SDF-Objekte erstellen.

urrent_request = all_requests.begin();
while (current_request != all_requests.end()) {
  SimulatedDiskFile temp_file(...blah..blah..); ====> pointer to local variable is inserted
  disk.addFile(&temp_file);
  current_request++;

}

temp_file würde den Moment nächste Iteration in while-Schleife außerhalb des Gültigkeitsbereichs gehen. Sie müssen den Einsatzcode ändern. Erstellen SimulatedDiskFile Objekte auf Heap und schiebt sonst, wenn die Objekte kleiner als Speicher von Wert in der Serie.

Vereinbaren Sie mit @Earwicker. Alles sieht gut aus. Haben Sie einen Blick in all_requests? Vielleicht sind alle Dateinamen das gleiche drin und alles andere funktioniert? (Nur laut hier denken out)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top