2015-07-10 80 views
0

我想排序存储在另一个对象内的对象数组,然后显示排序的对象。我想按特定属性对这些对象进行排序。我不完全确定我应该如何运行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(); 

当我运行此我得到:

error: passing 'const Composer' as 'this' argument of 'int Composer::get_ranking()' discards qualifiers [-fpermissive] return a.get_ranking() < b.get_ranking();

error: no matching function for call to 'sort(Composer [100], Composer*, unresolved overloaded function type)' sort(composers_, composers_+next_slot_, SortByRank);

添加一个const,以get_ranking结束()似乎已经解决了const正确性错误。

+4

在'SortByRank'中,'Composer'是const,'get_ranking()'不是。繁荣。 – Borgleader

+0

你真的得到了一个错误信息的子字符串“和错误:”,或者是你与他们之间的单词“和”(而不是换行符)连接的两个单独的错误消息? –

+0

你真的需要练习阅读C++错误:'错误:将'const Composer'作为'int'的参数传递给'Composer :: get_ranking()'丢弃限定符,即你的方法不是const正确的。 – rlbond

回答

0

好的,所以我做了相当数量的阅读并学了一点。

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

0

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

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

这是C++ const正确性的一部分。这意味着该方法不会更改对象的内部状态(除非mutable字段很少使用),它将被调用并允许通过const对象调用此方法。

相关问题