2

我最近开始学习 c++(没有事先的编程知识)。我使用了 Alex Allian 的《Jumping into c++》一书,我发现它最有用!然而,我已经读到了类、继承和多态性的章节,虽然我确实理解了其中的大部分内容,但我只是无法解决这个问题。

在书中,我被要求解决以下问题:

实现一个排序函数,它接受一个指向接口类 Comparable 的指针向量,该类定义了一个方法 compare(Comparable& other),如果对象相同,则返回 0,如果对象大于其他对象,则返回 1,以及 -1如果对象小于其他对象。创建一个实现该接口的类,创建几个实例,并对它们进行排序。如果您正在寻找创建内容的灵感,请尝试使用具有名称和分数的 HighScoreElement 类,并进行排序以使最高分数在前,但如果两个分数相同,则按名称对它们进行排序。

我创建了 Comparable 和 HighScores 类:

class Comparable {

public:

    virtual int compare(Comparable& other)=0;

};



class HighScore : public Comparable {

public:
    HighScore(int, std::string);

    virtual int compare(Comparable& other);


private:
    int highscore;
    std::string name;

};

如果我尝试覆盖 HighScore 中的继承函数,我无法将 int highscore 与(Comparable& other)的 int highscore 进行比较,因为我无法访问 other.highscore。下面的例子:

int HighScore::compare(Comparable& other){

    if (highscore == other.highscore) {
        return 0;
    }

    //...
}

我想我可以将虚拟方法更改为:

int HighScore::compare(HighScore& other){

    if (highscore == other.highscore) {
        return 0;
    }

    //...
}

因为那将允许我访问 other.highscore (我希望我能工作,因为 HighScore 也可以被认为是可比的。但可惜没有这样的运气。我该怎么办,我完全不知道如何继续,我将不胜感激我能得到的任何帮助。谢谢:)

4

3 回答 3

1

实际上,在像 C++ 这样的单调度语言中,尝试基于两个或多个对象的运行时类型来选择行为有点繁琐。

最简单的解决方案是使用 RTTI 来确定另一个对象是否具有与我们相当的类型:

int HighScore::compare(Comparable& other){

    int other_highscore = dynamic_cast<HighScore&>(other).highscore;

    if (highscore == other_highscore) {
        return 0;
    }

    //...
}

如果类型不可比较,这将引发异常,这可能是您能做的最好的事情。

或者,您可以实现涉及两个虚函数的双重调度机制(例如“访问者模式”)。我会让你自己研究一下,因为一个例子会很冗长,而且不是特别鼓舞人心。

希望您很快就会学会如何使用编译时泛型而不是运行时抽象接口来做到这一点,这在 C++ 中更为惯用。如果这本书没有教你这一点,那就扔掉它,取而代之的是其中之一。

于 2013-04-23T18:47:19.207 回答
0

您可以编写一个 pulic getter 函数来获取分数

class Comparable {
public:
    int get_score() const = 0;
    //
}

class HighScore : public Comparable {
public:
    int get_score() const { return highscore; }

然后用它来比较。

int HighScore::compare(Comparable& other){

    if (highscore == other.get_score()) {
                           ^^^^^^^^^^^
        return 0;
    }

    //...
}

但是由于只有派生类有highscore成员,所以您可能应该更改传递给比较的内容。

int HighScore::compare(HighScore& other)

或将highscore成员移动到基类。无论哪个男性对你有感觉。

于 2013-04-23T18:31:26.303 回答
0

我建议选择另一本关于这个主题的书。因为这个练习看起来很模糊,并且不能很好地理解多态性。棘手的部分是,当您进入Comparable您的compare方法时,您不知道它是否是HighScore或其他派生类。而且,如果您尝试比较的类不是HighScore等于小于和大于等术语的实例,则没有任何意义。因此,没有办法正确解决这个问题。您当然可以使用dynamic_cast它来检查它是否为HighScore,但如果它大于、小于或等于不是HighScore.
想象一下,有类似的东西class Color : public Comparable {存在。如果您将 Color 与 HighScore 进行比较,您应该返回什么?蓝色大于 10,还是黄色小于 15,红色等于什么?

于 2013-04-23T18:41:21.057 回答