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;

}

我不明白为什么在尝试比较两个指针时没有调用运算符。

4

2 回答 2

6

该运算符

bool operator<(const B* b2) const;

允许您将BLHSB*上的 a 与 RHS 上的 a 进行比较。您正在尝试与B*双方进行比较,因此运算符不适用。

您不能重载指针比较运算符,因此一种解决方案可能是根据B(or const B&) 进行比较并在比较点取消引用您的指针:

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

您不能重载运算符来比较指针。即使可以,大多数时候它仍然是非法的。您只能比较指向同一数组内的内存的指针,或数组末尾之后的一个位置。除此之外的任何行为都是未定义的行为。

B::bool operator<(const B* b2) const;实际上应该是bool operator<(const B& b2) const;。这允许您比较 2 个B对象,而不是一个对象和一个指向对象的指针 - 这就是您的代码现在所做的

如果您必须对指针容器进行排序,您可以提供一个比较函数作为回调函数,该回调函数将 2 个指针作为参数,但以指针作为参数operator<作为成员实现是没有意义的。

于 2012-11-05T13:19:02.020 回答