我正在尝试创建一个表示数据的抽象类,并设置了比较函数。我的优先级队列存储指向这些抽象数据类的指针。
抽象数据类实现了()运算符来进行初始比较,但随后调用虚拟比较函数进行自定义比较。
以下是代码:
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;
我在此设置中缺少什么?它不会调用FFTData的compare
函数。
注意:这只是测试功能,所以虽然此时FFTData比较功能本质上应该反转非NULL AbsData指针的顺序,但最终会增加更多功能。
答案 0 :(得分:3)
您正在从AbsData比较器的实例调用return this->compare(p1, p2);
。它不是派生类!
要解决此问题,请在传递给它的其中一个指针上调用compare。更好的是,不要混合使用比较器和数据。创建一个独立的比较器类。
你的代码中还有另一个待完成的改进 - 废除原始指针,切换到智能指针。