我想通过他们的地址比较两个对象。我试过运算符重载,它似乎不适用于指针,但适用于对象本身。以下是相关代码:
class C {
public:
int x;
};
.
.
.
bool operator <( C *ptr_c1, C *ptr_c2 )
{
return ( (*ptr_c1).x < (*ptr_c2).x );
}
答案 0 :(得分:10)
我尝试过运算符重载,它似乎不适用于指针,
正确。
但适用于对象本身。
正确。
那么问题是什么?
您想在已排序的容器中使用指针吗?
使用:
#include <iostream>
#include <set>
struct X
{
int x;
};
C ++ 11及更高版本
int main()
{
X x1; x1.x = 5;
X x2; x2.x = 6;
auto compare = [](auto const& lhs, auto const& rhs){return lhs->x < rhs->x;};
std::set<X*, decltype(compare)> plop(compare);
plop.insert(&x1);
plop.insert(&x2);
}
在C ++ 03中
struct XPTest
{
bool operator()(X* const& lhs,X* const& rhs)
{
return lhs->x < rhs->x;
}
};
int main()
{
X x1; x1.x = 5;
X x2; x2.x = 6;
std::set<X*,XPTest> plop;
plop.insert(&x1);
plop.insert(&x2);
}
答案 1 :(得分:5)
指针是本机C ++类型,您只能为用户定义的类型(即类)重载运算符。
如果这是可能的话,它将违反“最少惊喜”的原则,并导致指针比较根据您的定义是否可见而表现不同。这可能会非常令人困惑。
如果要在容器或算法中使用替代比较,请注意您可以在大多数关联容器和需要部分订单的算法中提供默认std::less
的替换。
答案 2 :(得分:1)
if(*obj1 < *obj2) { /* this should use the overloaded operator. */ }