在 C++ 中调用虚拟比较优先级

Calling virtual compare for priority in C++

我正在尝试创建一个抽象 class 来表示数据并设置一个比较函数。我的优先级队列存储指向这些抽象数据的指针 classes.

抽象数据 class 实现 () 运算符进行初始比较,然后调用虚拟比较函数进行自定义比较。

代码如下:

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来表示其他类型的数据:

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 指针的顺序,但最终它会添加更多功能。

您正在从 AbsData 比较器的实例调用 return this->compare(p1, p2);。它不是派生的 class!

要解决此问题,请对传递给它的指针之一调用比较。更好的是,不要混合比较器和数据。创建一个独立的比较器class.

您的代码中还有另一项待改进 - 取消原始指针,切换到智能指针。