在 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.
您的代码中还有另一项待改进 - 取消原始指针,切换到智能指针。
我正在尝试创建一个抽象 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.
您的代码中还有另一项待改进 - 取消原始指针,切换到智能指针。