سؤال

لدي التالية functor:

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;
      }
    }
};

فمن المفترض أن تكون صارمة ضعف الطلب ، وهذا طويلة (يمكن أن يكون سطر واحد فقط) من أجل تصحيح الأغراض.

أنا باستخدام هذا functor كأساس للمقارنة functor عن المحكمة الخاصة بلبنان::تعيين.المشكلة فقط إدراج العنصر الأول.عن طريق إضافة وحدة الإخراج إلى وظيفة مقارنة تعلمت أنه في الواقع مقارنة اسم الملف نفسه في كل مرة.

الأخرى ذات الصلة خطوط هي:

typedef set<SimulatedDiskFile *, ComparatorClass> FileSet;

و

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

تحرير: رمز المكالمات .addFile() هو:

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++;
}

حيث all_requests قائمة ، الطبقة طلب مثل هذا:

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();
};

أتمنى أن أقدم hypotesis ما يحدث ، ولكن في الواقع لدي أي فكرة.شكرا مقدما على أي مؤشرات.

هل كانت مفيدة؟

المحلول

لا يوجد شيء خاطئ مع رمز كنت قد نشرت ، تحدث وظيفيا.هنا هو اختبار كامل البرنامج - لقد ملأت الفراغات لا تغيير التعليمات البرمجية الخاصة بك على الإطلاق.

#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;
}

يمكنني الحصول على هذا الناتج:

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

نلاحظ أن مجموعة ينتهي مع الثلاثة الأشياء المخزنة في المقارنة تسجيل يظهر معقولة السلوك.

تحرير:

الخلل هو في هذه الخط:

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

disk.addFile(&temp_file);

كنت أخذ عنوان كائن محلي.في كل مرة حول حلقة هذا الكائن هو تدمير الكائن التالي هو تخصيص في نفس الفضاء.وذلك فقط كائن النهائي لا يزال موجودا في نهاية الحلقة و إضافة مؤشرات متعددة على نفس ذلك الكائن.خارج الحلقة ، كل الرهانات لأنه الآن أيا من الكائنات في الوجود.

إما تخصيص كل SimulatedDiskFile جديدة (مثل اختبار لي ، ولكن بعد ذلك سيكون لديك لمعرفة متى حذفها), أو آخر لا تستخدم المؤشرات على الإطلاق (أسهل بكثير إذا كان يناسب القيود المشكلة).

نصائح أخرى

و هنا المشكلة:

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

إضافة مؤشر إلى متغير التي دمرت على الفور.تحتاج إلى حيوي إنشاء الخاصة بك SDF الكائنات.

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 سوف تخرج من نطاق هذه اللحظة التكرار التالي في حين حلقة.كنت بحاجة إلى تغيير إدراج رمز.إنشاء SimulatedDiskFile الكائنات على كومة ودفع خلاف ذلك إذا كانت الأشياء هي أصغر ثم تخزين قيمة في مجموعة.

أتفق مع @Earwicker.كل شيء تبدو جيدة.هل كان لديك نظرة داخل all_requests?ربما كل أسماء الملفات هي نفسها هناك و كل شيء يعمل على ما يرام ؟ (مجرد التفكير بصوت عال هنا)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top