C ++: Перегрузка операторов <для указателей на объекты - PullRequest
7 голосов
/ 14 сентября 2009

Я бы хотел сравнить два объекта по их адресам. Я попытался перегрузить оператор, и он, похоже, не работает для указателей, но работает для самих объектов. Ниже приведен соответствующий код:

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

Ответы [ 3 ]

10 голосов
/ 14 сентября 2009

Я попытался перегрузить оператор, и он не работает для указателей,

Correct.

но работает для самих объектов.

Correct.

Так в чем же вопрос?

Хотите использовать указатели в отсортированном контейнере?

С:

#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);
}

В С ++ 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);
}
5 голосов
/ 14 сентября 2009

Указатель является собственным типом C ++, и вы можете перегружать операторы только для пользовательских типов (то есть классов).

Если бы это было возможно, это нарушило бы принцип «наименьшего удивления» и приводило бы к тому, что сравнения указателей ведут себя по-разному в зависимости от того, было ли ваше определение видимым. Это, вероятно, очень запутанно.

Если вы хотите использовать альтернативное сравнение для использования в контейнере или с алгоритмами, обратите внимание, что вы можете обеспечить замену по умолчанию std::less в большинстве ассоциативных контейнеров и алгоритмов, которые требуют частичного заказа.

1 голос
/ 14 сентября 2009
if(*obj1 < *obj2) { /* this should use the overloaded operator. */ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...