4

クラス内で、同じクラスのメソッドを渡すことにより、ベクトルをソートしようとしています。ただし、コンパイル時にエラーが発生します。誰かが問題が何であるかを知ることができますか?ありがとうございました!

次のエラーが発生します:bool型の引数bool (Sorter::)(D&, D&)' does not match(Sorter :: *)(D&、D&) '

私も使ってみましたsortBynumber(D const& d1, D const& d2)

#include<vector>
#include<stdio.h>
#include<iostream>
#include<algorithm>

class D {
      public:                   
             int getNumber();            
             D(int val);
             ~D(){};
      private:
              int num;
};

D::D(int val){
         num = val;
         };

int D::getNumber(){
    return num;
};


class Sorter {
      public:                   
             void doSorting();  
             bool sortByNumber(D& d1, D& d2);
             std::vector<D> vec_D;          
             Sorter();
             ~Sorter(){};
      private:
              int num;
};

Sorter::Sorter(){                 
        int i;
        for ( i = 0; i < 10; i++){
            vec_D.push_back(D(i));
           }
         };

bool Sorter::sortByNumber(D& d1, D& d2){
     return d1.getNumber() < d2.getNumber();
     };

void Sorter::doSorting(){
     std::sort(vec_D.begin(), vec_D.end(), this->sortByNumber);
     };




int main(){    
    Sorter s;
    s.doSorting();

    std::cout << "\nPress RETURN to continue...";
    std::cin.get();

    return 0;
}
4

4 に答える 4

6

静的にしSorter::sortByNumberます。オブジェクトメンバーを参照しないため、他に何も変更する必要はありません。

class Sorter {
public:                   
    static bool sortByNumber(const D& d1, const D& d2);
    ...
};

// Note out-of-class definition does not repeat static
bool Sorter::sortByNumber(const D& d1, const D& d2)
{
    ...
}

sortByNumberオブジェクトを変更してはならないので、const参照も使用する必要があります。

于 2010-05-11T05:16:57.730 に答える
4

他の方法で行う本当に正当な理由がない限り、operator<並べ替えるアイテムのタイプを定義して、それで完了します。

class D { 
    int val;
public:
    D(int init) : val(init) {}
    bool operator<(D const &other) { return val < other.val; }
};

class sorter { 
    std::vector<D> vec_D;
public:
    void doSorting() { std::sort(vec_d.begin(), vec_D.end()); }
};

クラスを作成する方法は、クラスの内部について多くsorterのことを知っているかどうかに依存します。つまり、クラスは実質的に単一のクラスであるという点に依存します(たとえば、どちらも他のクラスなしではほとんど何もできないように見えます)。D

推測では、あなたsorterはあなたの実際のコードのいくらか簡素化されたバージョンかもしれません。はSortByNumber、元のコードが次のようなさまざまな種類のキーをサポートしているように聞こえます。

class D { 
    std::string name;
    int height;
    int weight;
// ...
};

Dまた、オブジェクトを名前、高さ、または重量で並べ替えることができるようにする必要があります。そのような場合、比較は実際にはまだDクラスに関連しているので、おそらくそれらを共通の名前空間に入れます。

namespace D { 
class D { 
    std::string name;
    int height;
    int weight;
public:
    friend class byWeight;
    friend class byHeight;
    friend class byName;
    // ...
};

struct byWeight { 
   bool operator()(D const &a, D const &b) { 
       return a.weight < b.weight;
   }
};

struct byHeight {
    bool operator()(D const &a, D const &b) { 
        return a.height < b.height;
    }
};

struct byName { 
    bool operator()(D const &a, D const &b) { 
        return a.name < b.name;
    }
};
}

その場合、並べ替えは次のようになります。

std::vector<D::D> vec_D;

// sort by height:
std::sort(vec_D.begin(), vec_D.end(), D::byHeight());

// sort by weight:
std::sort(vec_D.begin(), vec_D.end(), D::byWeight());

// sort by name:
std::sort(vec_D.begin(), vec_D.end(), D::byName());

これは無料の関数を使用しないことに注意してください。この種の目的のために、ファンクターが一般的に好ましい。また、名前空間を使用して、並べ替えられるオブジェクトとさまざまな並べ替え方法との関連を示しました。代わりにそれらをネストされたクラスにすることもできますが、私は一般的に共通の名前空間を好みます(結合をできるだけ緩く保ちます)。

いずれにせよ、回避できれば(この場合は可能です)、オブジェクトのパブリックインターフェイスを介した生データへのアクセス(読み取り専用アクセスであっても)は許可しません

于 2010-05-11T06:07:35.223 に答える
2

sortByNumber()メンバー関数になる理由はわかりません。メンバー関数の場合、必要のないものにアクセスできます(したがって、アクセスするべきではありません)。メソッドを抽出し、それを関数オブジェクトにリファクタリングします。

struct sortByNumber {
    bool operator()(const D& d1, const D& d2) const {
        return d1.getNumber() < d2.getNumber();
    }
};

またはそれを無料の関数にします。選択肢があれば、関数オブジェクトを選択する必要があります。これにより、コンパイラーが選択した場合にコードをインライン化できるようになります。次に、次のように並べ替えることができます。

std::sort(vec_D.begin(), vec_D.end(), sortByNumber());

そうは言っても、次のようにして、コードをそのままコンパイルすることができますboost::bind()

std::sort(vec_D.begin(), vec_D.end(),
          boost::bind(&Sorter::sortByNumber, this, _1, _2));

それを機能させるには、ブーストライブラリが必要です#include <boost/bind.hpp>

于 2010-05-11T05:38:39.707 に答える
1

sortByNumberクラスSorterのメンバー関数として作成する理由はありません。無料の関数にすると、すべての醜いバインドコードを回避して、はるかに簡単に並べ替えを行うことができます。また、constコード内で該当する場合は常に使用する必要があります。以下は、free関数を使用してそれを行う例です。

まず、 int getNumber() toをconst関数に変更します。int getNumber() const;

sortByNumber次に、const参照によってパラメーターを取得して 、free関数を再度記述します。bool sortByNumber(const D& d1, const D& d2);

あなたは次のように呼び出すことができますsortstd::sort(vec_D.begin(), vec_D.end(), sortByNumber);

于 2010-05-11T05:35:03.647 に答える