我正在尝试使用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类继承并实现一个方法来使用优先级队列。
感谢先进的任何帮助!
答案 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 ++语言的一个新特性,并没有得到广泛支持甚至已知。