繁体   English   中英

Vector使用抽象类C ++实现优先级队列

[英]Priority Queue implemented by Vector using Abstract Class C++

我正在尝试使用C ++中的Vector模板实现优先级队列。 我最熟悉Java并希望模仿接口的概念,其中所有可以使用优先级队列的对象都需要实现某些方法。

我知道C ++不支持接口,但有人建议通过使用多重继承,这可以通过创建一个抽象类并需要一些虚函数来实现。

我想所有可以使用Priority Queue的对象实现:

public:
int compareTo(Comparable &obj);

这是一个实现此目的的C ++抽象类:Comparable.h

class Comparable {
public:
    Comparable();
    ~Comparable();
    virtual int compareTo(Comparable &obj) = 0;
};

这很好用,没有错误通过将Abstract类提供给Vector模板而形成:

vector<Comparable> *mElements = new vector<Comparable>(); // no error

直到我尝试在继承自Comparable类的类中使用多态,我才遇到问题。 因为Method签名收到Comparable&,所以我无法访问扩展Comparable的类的成员:

int Event::compareTo(Comparable& obj) {
    // Min-Heap - time of currentObject is less than e.mTime
    Event e = (Event) obj; // Doesn't work - No C-style cast (can I make one and how?)
// if I trying obj.mTime, this won't work because it is not a member of the Comparable class


if (mTime < e.mTime) return Delta::NEGATIVE_CHANGE;
if (mTime > e.mTime) return Delta::POSITIVE_CHANGE;
    return return Delta::NO_CHANGE;
}

我需要做的就是比较这个例子中的时间,但是我想设计一个类,这样客户端只需从Comparable类继承并实现一个方法来使用优先级队列。

感谢先进的任何帮助!

您正在搜索dinamic_cast http://en.cppreference.com/w/cpp/language/dynamic_cast

dinamic_cast有一个丑陋的名字因为你不应该使用它太多。 在这种情况下,您不需要它。

首先,在C ++中,您可以重载运算符(<,>,== ...)。 如果这些运算符不存在,则无法比较该类。 比较更自然,更容易:)

其次,您可以使用通用模板:

template<class T>
class Comparable {
public:
    Comparable();
    ~Comparable();
    virtual int compareTo(T &obj) = 0;
};

class event : public Comparable<event> {
    //...
    public:
        int compareTo(event &e) override;
};

你可以在编译时检测错误的类型,你不需要执行时间转换:)

override是编译器的一个c ++ 11标志:“此函数应覆盖一个父函数,检查它”。 如果不使用C ++ 11,可以自由删除它

实际上,如果PriorityQueue类本身就是模板,则根本不需要Comparable类。 它将针对实现compareTo类型进行编译,并且不会针对不实现它的类型进行编译。

template <class T>
class PriorityQueue {
    ...
    void someMethod(const T& obj) {
        if (someOtherObj.compareTo(obj)) {
            ...
        }
    }
    ...
}

正如我之前在评论中所说,STL订购的容器使用仿函数而不是为其元素需要一些特定的接口。 比使用仿函数更容易使用<来比较对象:

if (someOtherObj < obj) {

Comparable类实际上符合concept (C ++ 14)的concept ,而不是抽象接口。 它有助于澄清模板类/函数它所需的接口是什么,但概念是C ++语言的一个非常新的特性,并没有得到广泛支持甚至已知。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM