在类中的数组中按属性对对象进行排序,这些类本身就是另一个类的对象

时间:2015-07-10 20:05:16

标签: c++ arrays oop sorting

我正在尝试对存储在另一个对象中的对象数组进行排序,然后显示已排序的对象。我想通过特定属性对这些对象进行排序。我不确定我应该如何运行sort()方法。

composer.h

class Composer {
  Public:
    int get_ranking();
    ..
    ..
};

database.h

Class Database {
  Public:
    void DisplayAll(){
      for(int i=0;i<next_slot_;i++){
            composers_[i].Display();
      }
    };

    bool SortByRank(Composer const & a, Composer const & b) {
        return a.get_ranking() < b.get_ranking();
    };

    void DisplayByRank(){
      sort(composers_, composers_+next_slot_, SortByRank);
      DisplayAll();
    };

testdatabase.cpp

int main(){
  Database myDB;

  Composer& comp1 = myDB.AddComposer("Ludwig van", "Beethoven", "Romantic", 1770,
                   "Beethoven was completely deaf during the latter part of his life - he 
                    never heard a performance of his 9th symphony.");
  comp1.Promote(7);

  Composer& comp2 = myDB.AddComposer("Johann Sebastian", "Bach", "Baroque", 1685,
                   "Bach had 20 children, several of whom became famous musicians as well.");
  comp2.Promote(5);

  cout << endl << "all Composers: " << endl << endl;
  myDB.DisplayAll();
  myDB.DisplayByRank();

当我跑步时,我得到:

  

错误:将'const Composer'作为'int Composer :: get_ranking()'的'this'参数传递,丢弃限定符[-fpermissive]返回a.get_ranking()&lt; b.get_ranking();

  

错误:没有用于调用'sort(Composer [100],Composer *,未解析的重载函数类型)的匹配函数      sort(composers_,composers_ + next_slot_,SortByRank);

将const添加到get_ranking()的末尾似乎已经解决了const正确性错误。

2 个答案:

答案 0 :(得分:0)

您应该将const添加到get_ranking方法。

class Composer {
public:
    int get_ranking() const;
};

这是C ++ const-correctness的一部分。这意味着该方法不会更改对象的内部状态(除了很少使用的mutable字段之外)它被调用并允许通过const个对象调用此方法。

答案 1 :(得分:0)

好吧,所以我做了相当多的阅读并学到了一点。

通过将int get_ranking();更改为int get_ranking()const来解决我的常规正确性后,我发现我的SortByRank()仍然无法正常工作。这是因为它是数据库的非静态成员,需要this指针。只需将其更改为:static bool SortByRank();或在Database类之外定义SortByRank()即可解决问题。