3

オーバーロードされた<演算子を使用した挿入ソートを使用してポインターのベクトルを並べ替えようとしています(ライブラリーは使用できません)。次のような別のクラスを含むクラスがある。

class A {   
 vector<B*> v;
 void order();
}

class B {
int id;                         //each one is unique
virtual double num() {} const;
bool operator<(const B* b2) const;
}

class B1: public B {
double num() {} const;
}

class B2: public B {
double num() {} const;
}

子ごとにnumの計算方法が異なり、最初の基準としてnumから返されたdoubleを使用し、次にidを使用して並べ替えが行われます。(インデントでごめんなさい)

void A::order() {

for (unsigned int p = 1; p < v.size(); p++)    
{
    ClassB* tmp = v[p];
    int j;
    for (j = p; j > 0 && tmp < v[j-1]; j--) // Error on this line
        v[j] = v[j-1];
    v[j] = tmp;     
}

}



bool B::operator<(const B* b2) const {

cout << "Operator <\n";

if(this->num()!=b2->num())
    return this->num()<b2->num();

return id<d2->id;

}

2つのポインターを比較しようとしたときに、なぜオペレーターが呼び出されないのか理解できません。

4

2 に答える 2

6

この演算子

bool operator<(const B* b2) const;

BLHSのaB*をRHSのaと比較できます。B*両側で比較しようとしているので、演算子は適用されません。

ポインター比較演算子をオーバーロードすることはできないため、1つの解決策は、B(またはconst B&)に関して比較し、比較の時点でポインターを逆参照することです。

for (j = p; j > 0 && *tmp < *v[j-1]; j--)
于 2012-11-05T13:18:41.150 に答える
3

ポインタを比較するために演算子をオーバーロードすることはできません。そして、あなたができたとしても、それはほとんどの場合違法です。比較できるのは、同じ配列内のメモリ、または配列の終わりから1つ後の位置を指すポインタのみです。それ以外は未定義動作です。

あなたB::bool operator<(const B* b2) const;は実際にあるべきbool operator<(const B& b2) const;です。Bこれにより、オブジェクトとオブジェクトへのポインターの代わりに、2つのオブジェクトを比較できます。これは、コードが現在行っていることです。

ポインターのコンテナーをソートする必要がある場合は、パラメーターとして2つのポインターを受け取るコールバックとして比較関数を提供できますが、パラメーターとしてポインターを使用してメンバーとして実装operator<することは意味がありません。

于 2012-11-05T13:19:02.020 に答える