2015-11-25 2 views
1

Я пытаюсь создать абстрактный класс для представления данных и установить функцию сравнения. Моя очередь приоритетов хранит указатели на эти абстрактные классы данных.Вызов виртуального сравнения для приоритета в C++

Класс абстрактных данных реализует оператор() для выполнения первоначального сравнения, но затем вызывает функцию виртуального сравнения для выполнения пользовательских сопоставлений.

Вот код:

class AbsData { 

public: 
    AbsData() { 
     order = 0; 
    } 

    AbsData(int order) { 
     this->order = order; 
    } 

    virtual ~AbsData() {} 

    bool operator()(const AbsData* p1, const AbsData* p2) const { 
     if (p1 && !p2) 
      return false; 

     if (!p1 && p2) 
      return true; 

     if (!p1 && !p2) 
      return true; 

     return this->compare(p1, p2); 
    } 

    virtual bool compare(const AbsData *p1, const AbsData *p2) const { 
     return p1->getOrder() > p2->getOrder(); 
    } 

    int getOrder() const 
    { 
     return order; 
    } 

private: 
    int order; 

}; 

Затем я использую этот абстрактный класс данных для представления других типов данных:

class FFTData : public AbsData { 

public: 
    FFTData(ImageStitching::FFTWImageTile * tile, int order) : AbsData(order) 
    { 
     this->tile = tile; 
    } 

    ImageStitching::FFTWImageTile * getTile() const { 
     return this->tile; 
    } 


    // Should override the virtual compare 
    bool compare(const AbsData *p1, const AbsData *p2) const { 
     return p1->getOrder() < p2->getOrder(); 
    } 

private: 
    ImageStitching::FFTWImageTile * tile; 
}; 

Я определяю свою очередь приоритета, как это:

std::priority_queue<AbsData *, std::vector<AbsData *>, AbsData> queue; 

Что мне не хватает в этой настройке? Он не будет вызывать функцию compare FFTData.

ПРИМЕЧАНИЕ. Это просто проверка функциональности, поэтому, хотя в это время функция сравнения FFTData по существу должна инвертировать порядок указателей на NULL AbsData, в конечном итоге она добавит больше функциональности.

+0

check -> http://stackoverflow.com/questions/23997104/priority-queue-with-pointers-and-comparator-c – simpel01

+0

Оператор AbsData вызывается std lib priority_queue, поэтому сравнение выполняется правильно для указателей. Это просто не вызывает функцию сравнения ребенка ... Только придерживаться функции сравнения AbsData. – Jameshobbs

+0

Когда вы создаете свои объекты FFTData, как вы это делаете? –

ответ

3

Вы вызываете return this->compare(p1, p2); из экземпляра вашего компаратора AbsData. Это не производный класс!

Чтобы устранить проблему, сравните вызов по одному из переданных ему указателей. Еще лучше, не смешивайте компаратор и данные. Создайте независимый класс компаратора.

У вас есть еще одна усовершенствованная версия в вашем коде - покончите с необработанными указателями, переключитесь на умных.

+0

Это было! Спасибо!!! Иногда вы просто пропустите такие простые вещи. – Jameshobbs

+0

Я посмотрю, что я могу сделать с помощью умных указателей. Я больше знаком с C и не имею большого опыта работы на C++. Я читал о них, и они кажутся хорошим способом управления памятью и меньше беспокоятся о утечках. Спасибо за предложение. – Jameshobbs

Смежные вопросы