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

时间:2015-02-27 00:02:47

标签: c++ vector interface multiple-inheritance

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

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

我希望所有可以使用优先级队列的对象实现:

public:
int compareTo(Comparable &obj);

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

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

这很好用,不会因为将抽象类提供给Vector模板而形成错误:

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

直到我尝试在继承自我遇到问题的Comparable类的类中使用多态。因为Method签名收到Comparable&amp;,我无法访问扩展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类继承并实现一个方法来使用优先级队列。

感谢先进的任何帮助!

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

,可以自由删除它

答案 1 :(得分:0)

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

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

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

if (someOtherObj < obj) {

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