[英]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.