как перегрузить оператор ==, чтобы разрешить его использование в нескольких сравнениях? - PullRequest
2 голосов
/ 23 октября 2010

Я пытаюсь перегрузить оператор == для сравнения объектов, как показано ниже.

class A
{
    int a;
public:
    A(int x) { a = x; }
    bool operator==(const A& obRight)
    {
        if(a == obRight.a)
        {
            return true;
        }
        return false;
    }
};

int main()
{
    A ob(10), ob2(10), ob3(10);
    if(ob == ob2) // This equality comparison compiles fine.
        cout<<"Equal"<<endl;
     if(ob == ob2 == ob3) //This line doesn't compile as overloaded 
                          // == operator doesn't return object (returns bool)
           cout<<"Equal"<<endl;
}

Как я описал выше, я не могу выполнить сравнение нескольких объектов в одной строке
как if(ob == ob2 == ob3)используя перегруженный оператор == через функцию-член.

Должен ли я перегружаться с помощью функции друга?

Ответы [ 3 ]

11 голосов
/ 23 октября 2010

Как правило, вы НЕ ДОЛЖНЫ ДЕЛАТЬ ЭТОГО в реальном коде.
Поскольку использование полностью отличается от того, что ожидают другие люди.Неожиданные вещи не интуитивны, и неинтуитивен делает трудным для поддержки (или понимания) код для кого-то, кто не знаком с базой кода.

Но в качестве академического упражнения.

Вам нужно, чтобы оператор == возвратил объект, чтобы, если он использовался в другом тесте, он выполнял тест, но если его просто оставили в логическом контексте, он автоматически конвертировался в bool.

#include <iostream>
using namespace std;

template<typename T>
class Test
{
    public:
        Test(T const& v, bool s)
            :value(v)
            ,state(s)
    {}

    Test operator==(T const& rhs) const
    {
        return Test<T>(value, state && value == rhs);
    }
    operator bool() const
    {
        return state;
    }
    private:
        T const&    value;
        bool        state;
};

class A
{
    int a;
    public:
    A(int x) { a = x; }
    Test<A> operator==(const A& obRight) const
    {
        return Test<A>(*this, a == obRight.a);
    }
};

int main()
{
    A ob(10), ob2(10), ob3(14);
    if(ob == ob2) // This equality comparison compiles fine.
        cout<<"Equal"<<endl;
    if(ob == ob2 == ob3) 
        cout<<"Equal"<<endl;
}
11 голосов
/ 23 октября 2010

Нет.Вы в корне неправильно поняли свою работу.

if (ob == ob2 == ob3) =
if (ob == (ob2 == ob3)

Подумайте о типах.

if (A == (A == A))
if (A == bool) // Oh dear, no == operator for bool!

Вам нужно иметь

if ((ob == ob2) && (ob == ob3))
if ((A == A) && (A == A))
if (bool && bool) // fine
1 голос
/ 23 октября 2010

Вы можете создать функцию, подобную этой

#include<stdarg.h>
template<class T>
bool equals(size_t num, T val,...)
{
    va_list arguments;

    va_start(arguments,num);

    for(size_t i = 0; i<num; ++i)
        if(val != va_arg(arguments, int))
        {
            va_end ( arguments );
            return false;       
        }
    va_end ( arguments );
    return true;
}

и используйте его

if(equals(3,ob1,ob2,ob3))
    //do some stuff here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...