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

时间:2015-11-25 19:03:21

标签: c++ inheritance priority-queue

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

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

以下是代码:

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

1 个答案:

答案 0 :(得分:3)

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

要解决此问题,请在传递给它的其中一个指针上调用compare。更好的是,不要混合使用比较器和数据。创建一个独立的比较器类。

你的代码中还有另一个待完成的改进 - 废除原始指针,切换到智能指针。