2017-11-24 4 views
0

私はファーストクラスを持っています。私は別のクラスを持っており、これらのクラスのオブジェクトを持つベクトルを作成し、値でソートしたいと考えています。

class Class1 
{ 

public: 
    Class1(); 
    double getVal(); 
    bool operator<(Class1& A) { return getVal() > A.getVal(); } 
virtual ~Class1(); 
} 

そしてこのクラスから私は2つのクラスを導出する。

class Class2 : virtual public Class1 
{ 
protected: 
    int val1; 
public: 
int getVal(){ return val; } 
bool operator<(Class1& A) { return getVal() > A.getVal(); } 
} 

2番目のクラスです。

class Class3 : virtual public Class1 
{ 
    protected: 
     double val2; 
    public: 
     double getVal(){ return val; } 
     bool operator<(Class1& A) { return getVal() > A.getVal(); } 
} 

最後にこれらのクラスから、私は1つのクラスを派生します。

void main(){ 
    vector<Class1*> vec; 
    vec.push_back(new Class2(3)); 
    vec.push_back(new Class3(5)); 
    vec.push_back(new Class4(2)); 
    sort(vec.begin(),vec.end()); 
} 

コードだけで罰金ベクトル内のオブジェクトを押し戻しているが、私はそれをソートするためにしようとしているとき、何も起こりません:

class Class4 : public Class2, public Class3 
{ 
    protected: 
     char* info; 
    public: 
     double getVal(){ return val1+val2; } 
     bool operator<(Class1& A) { return getVal() > A.getVal(); } 
} 

は、メインに私が持っています。 親クラス(Class1)と主にgetVal()メソッドに問題があると思われますが、何をすべきかわかりません。 質問は:どのように私はこのベクトルをソートできますか?

+0

*しかし、私がそれをソートしようとしているときに何も起こらない* - 事が*起こっている*。 'std :: sort'はあなたが書いたものを正確に実行しています。これはポインタの値をソートすることです。 – PaulMcKenzie

+0

あなたのメソッドは 'const'(そしてconst参照を取ることができます)です。 – Jarod42

+0

派生クラスで 'getVal()'を非表示にすることを意図していますか?他の名前を使う方が良いようです。 (または、仮想ゲッターが必要な場合は、同じ型を返すべきです( 'int'と' double'は共変型ではありません))。 – Jarod42

答えて

8

ここでの問題は、ポインタのベクトルを持つことです。したがって、std::sortによって行われる比較は、ポインタを使用して行われ、それらによって指し示される構造体は行われません。

これを機能させるには、引数として2つのポインタをとるグローバルoperator<関数を用意する必要があります。または、比較関数をstd::sortの3番目の引数として指定します。どちらもポインタを逆参照する必要があります。

また、多型が機能するには、関数をvirtualとしてマークする必要があります。

関連する問題