【发布时间】:2015-02-27 00:02:47
【问题描述】:
我正在尝试使用 C++ 中的 Vector 模板实现优先级队列。我对 Java 最满意,并想模仿接口的想法,其中需要所有可以使用优先级队列的对象来实现某些方法。
我知道 C++ 不支持接口,但是,有人建议通过利用多重继承,这可以通过创建抽象类并需要一些虚函数来实现。
我想要所有可以使用优先队列的对象来实现:
public:
int compareTo(Comparable &obj);
这是一个实现此目的的 C++ 抽象类: 可比.h
class Comparable {
public:
Comparable();
~Comparable();
virtual int compareTo(Comparable &obj) = 0;
};
这很好用,将抽象类提供给 Vector 模板不会产生任何错误:
vector<Comparable> *mElements = new vector<Comparable>(); // no error
直到我尝试在从 Comparable 类继承的类中使用多态性时才遇到问题。因为方法签名收到一个 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 类继承并实现一个使用优先级队列的方法。
感谢任何高级帮助!
【问题讨论】:
-
~Comparable();->virtual ~Comparable();,如果compareTo需要知道obj的具体类型,那么您的设计可能有问题。如果你确定这是你想要的,你可以使用dynamic_cast。 -
C++ 不是 Java,多重继承是自取其辱的好方法。
-
@CollinDauphinee 我同意,最好的选择是使用运算符。他不需要类似的课程。
-
确实,
operator<是一个比抽象基类更 C++ 风格的解决方案,但更 C++ 风格和更灵活的解决方案是使用 functor 默认转至std::less,即STL有序容器的接口,如std::map或std::set。但是,对于初学者来说,语法要复杂得多。
标签: c++ vector interface multiple-inheritance