【问题标题】:C++ pure virtual method with the interface itself as parameter以接口本身为参数的 C++ 纯虚方法
【发布时间】:2014-07-26 03:30:42
【问题描述】:

我正在实现一个快速排序算法。我有一个界面

class Comparable{
public:
    virtual int compareTo(Comparable *c)=0;
};

现在我有一个名为 ComparableInt 的类,它实现了 Comparable:

class ComparableInt: public algorithm::Comparable{
public:
    int value;
    int compareTo(Comparable *i) {
        ComparableInt *c = dynamic_cast<ComparableInt*>(i);
        return value - (*c).value;
    };
    ComparableInt(int i):value(i){};
};

我的问题是,这是正确的做法吗?我试图这样实现它:

class ComparableInt: public algorithm::Comparable{
public:
    int value;
    int compareTo(ComparableInt *i) {
        return value - (*i).value;
    };
    ComparableInt(int i):value(i){};
};

但似乎这个 int compareTo(ComparableInt *i) 不是 virtual int compareTo(Comparable *c) 的实现,所以我必须进行动态转换。寻求您的帮助!

【问题讨论】:

  • “本着 STL 精神”的做法是在快速排序中获取任何可调用对象,然后使用两个元素调用它。
  • 为什么要使用继承来实现排序?看看here,了解如何使用模板和标准库算法来完成这项工作。
  • 这种设计的问题在于,您无法真正控制您正在比较彼此真正可比的事物。它们实际上应该具有相同的派生类型,而不是相同的接口类型。

标签: c++ virtual


【解决方案1】:

试试这个:

template<typename T>
class Comparable
{
public:
    virtual int compareTo(Comparable<T> *c) = 0;
    virtual T getValue() = 0;
};

class ComparableInt: public algorithm::Comparable<int>
{
public:
    int value;
    int compareTo(Comparable<int> *i)
    {
        return value - i->getValue();
    };
    int getValue() { return value; } 
    ComparableInt(int i):value(i){};
};

【讨论】:

  • 如果我们要走虚函数路,我会把它定义为template&lt;typename T&gt; class Comparable { public: virtual int compareTo(T *c) = 0; }; class ComparableInt: public algorithm::Comparable&lt;ComparableInt&gt; { /*...*/ };
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2011-06-24
  • 2018-06-03
  • 2016-07-22
相关资源
最近更新 更多