C ++:运算符重载<用于指向对象的指针

时间:2009-09-14 06:39:25

标签: c++ operator-overloading pointers

我想通过他们的地址比较两个对象。我试过运算符重载,它似乎不适用于指针,但适用于对象本身。以下是相关代码:

class C {
        public:
                int x;
};
.
.
.
bool operator <( C *ptr_c1, C *ptr_c2 )
{
        return ( (*ptr_c1).x < (*ptr_c2).x );
}

3 个答案:

答案 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. */ }