Перегрузка = в C ++ - PullRequest
       9

Перегрузка = в C ++

0 голосов
/ 04 апреля 2009

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

У меня есть функция, не являющаяся членом, bool operator==( const MyClass& obj1, const myClass& obj2 ) определенный выход моего класса.

Я не могу войти ни в один из моих частных членов по понятным причинам.

Так что я думаю, что мне нужно сделать, это перегрузить оператор присваивания. И делать назначения в функции, не являющейся членом.

С учетом сказанного, я думаю, мне нужно сделать следующее:

  1. используйте мои функции и копируйте информацию, используя strcpy или strdup. Я использовал strcpy.
  2. перейти к оператору присваивания, bool MyClass :: operator = (const MyClass & obj1);
  3. Теперь перейдем к перегрузке функции (==) и назначим obj2 для obj1.

У меня нет конструктора копирования, поэтому я застрял с этим:

class Class
{
private:
m_1;
m_2;
public:
..
};

void Class::Func1(char buff[]) const
{   
    strcpy( buff, m_1 );
    return;
}
void Class::Func2(char buff[]) const
{
    strcpy( buff, m_2 );
    return;
}

bool Class& Class::operator=(const Class& obj)
{ 
    if ( this != &obj ) // check for self assignment.
    {
        strcpy( m_1, obj.m_1 ); 
        // do this for all other private members.
    }
    return *this;
}

bool operator== (const Class& obj1, const Class& obj2)
{
         Class MyClass1, MyClass2;
    MyClass1 = obj1;
    MyClass2 = obj2;

         MyClass2 = MyClass1;
         // did this change anything?
// Microsofts debugger can not get this far.
    return true;
}

Так что, как вы, вероятно, можете сказать, я полностью потерян в этой перегрузке. Какие-нибудь советы? У меня есть законченная версия, перегружающая того же оператора, только с ::, поэтому мои приватные участники не потеряют возможности. Я возвращаю свои назначения как истинные, и это работает в main. Вот пример из моей книги.

Будет ли работать перегрузка оператора присваивания, а затем предварительное преобразование в функции operator==, не являющейся членом? Смогу ли я после этого выполнить назначение объектов друг другу в основном?

Ответы [ 4 ]

7 голосов
/ 04 апреля 2009

У вас здесь есть пара очевидных ошибок, и есть некоторая путаница в том, чего вы на самом деле пытаетесь достичь. Во-первых, оператор присваивания operator = предназначен для копирования значения из одного экземпляра в другой. Возвращаемое значение оператора присваивания почти всегда является неконстантной ссылкой на цель копии, так что вы можете связать присваивания:

Class & operator=(const Class &rhs)
{
  // copy the members

  return *this;
}

Оператор сравнения operator == предназначен для выполнения сравнения двух экземпляров. Возвращает логическое значение true, если они равны:

boolean operator==(const Class &rhs) const
{
  // check if they are equal
  return something;
}

Путаница заключается в том, почему вы пытаетесь копировать значения или присваивать экземплярам в операторе сравнения?

6 голосов
/ 04 апреля 2009

Op == не является оператором присваивания. T & Op = (const T &) равно.

Оператор bool == (const T & lhs, const T & rhs) - это операция для сравнения двух Ts. Он возвращает true, если lhs равно rhs, для любого определения «равно», которое вы хотите закодировать.

0 голосов
/ 04 апреля 2009

Я предполагаю, что вы хотите сравнить два объекта. В этом случае вы можете просто перегрузить оператор == в классе «Класс». Вам не нужен оператор присваивания.

    class Class
    {
    public:
        Class(int i) : m_i(i){}

         bool operator==( const Class& rhs)
         {
            return m_i == rhs.m_i;
         }
    private:
        int m_i;

    };


int main()
{
   Class t1(10), t2(10);
   bool b = (t1 == t2);
}
0 голосов
/ 04 апреля 2009

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

class Test
{
public:
    Test(int i) : m_i(i){}
private:
    int m_i;

    friend bool operator==(Test&  first, Test& second);
};

bool operator==(Test&  first, Test& second)
{
    return first.m_i == second.m_i;
}

int main()
{
   Test t1(10), t2(10);
   bool b = (t1 == t2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...