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

sorting objects by attribute in an array within a class which are themselves objects of another class

本文关键字:对象 排序 另一个 一个 属性 数组      更新时间:2023-10-16

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

composer.h

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

数据库.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"参数传递会丢弃限定符[-fpermission]return a.get_rankinging((<b.get_ranking((;

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

在get_ranking((的末尾添加const似乎解决了const正确性错误。

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

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

这是C++常量正确性的一部分。这意味着该方法不会改变调用它的对象的内部状态(很少使用的mutable字段除外(,并允许const对象调用该方法。

好吧,所以我读了很多书,学到了一些东西。

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