Я пытаюсь создать абстрактный класс для представления данных и установить функцию сравнения. Моя очередь приоритетов хранит указатели на эти абстрактные классы данных.Вызов виртуального сравнения для приоритета в 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, в конечном итоге она добавит больше функциональности.
check -> http://stackoverflow.com/questions/23997104/priority-queue-with-pointers-and-comparator-c – simpel01
Оператор AbsData вызывается std lib priority_queue, поэтому сравнение выполняется правильно для указателей. Это просто не вызывает функцию сравнения ребенка ... Только придерживаться функции сравнения AbsData. – Jameshobbs
Когда вы создаете свои объекты FFTData, как вы это делаете? –