我正在尝试使用带有重载<的插入排序来命令指针向量。 operator(不能使用任何库)。 有一个包含另一个类的类,如:
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个指针时没有调用运算符。
答案 0 :(得分:6)
此运算符
bool operator<(const B* b2) const;
允许您将LHS上的B
与RHS上的B*
进行比较。您试图与双方的B*
进行比较,因此运算符不适用。
你不能重写指针比较运算符,所以一个解决方案可能是在B
(或const B&
)方面进行比较,并在比较时取消引用你的指针:
for (j = p; j > 0 && *tmp < *v[j-1]; j--)
答案 1 :(得分:3)
您不能重载运算符来比较指针。即使你可以,它在大多数时候仍然是非法的。您只能比较指向同一数组内存的指针,或数组结束后的一个位置。除此之外的任何事情都是未定义的行为。
您的B::bool operator<(const B* b2) const;
实际应该是bool operator<(const B& b2) const;
。这允许您比较2个B
个对象,而不是对象和指向对象的指针 - 这是您的代码现在所做的。
如果你必须对一个指针容器进行排序,你可以提供一个比较函数作为回调,它将2个指针作为参数,但是将operator<
作为成员实现,并将指针作为参数没有意义。