C ++ перегрузочный оператор присваивания - PullRequest
5 голосов
/ 15 января 2012

У меня есть класс с именем Location, и мне нужно было добавить CArray к его переменным-членам.Это изменение вызвало необходимость перегрузки оператора присваивания.

Есть ли способ скопировать все переменные этого класса, которые были скопированы до того, как я внес изменение, и просто добавить дополнительный код для копирования CArray, не копируя каждую отдельную переменную-член по отдельности?

Location& Location::operator=(const Location &rhs) 
{
    // Only do assignment if RHS is a different object from this.
    if (this != &rhs) 
    {
        //Copy CArray
        m_LocationsToSkip.Copy(rhs.m_LocationsToSkip);

        //Copy rest of member variables
        //I'd prefer not to do the following
        var1 = rhs.var1;
        var2 = rhs.var2;
        //etc
    }

    return *this;
}

Ответы [ 4 ]

4 голосов
/ 15 января 2012

Да, вроде.Используйте тип, который перегружает operator= сам, так что вам не нужно делать это в классе, в котором он содержится.Даже при написании кода MFC я все еще в основном использую std::vector, std::string и т. Д. Вместо классов MFC и классов строк.Иногда вы в значительной степени застряли, используя CString, но я не могу вспомнить, когда в последний раз я использовал CArray вместо std::vector.

2 голосов
/ 15 января 2012

Да. Что я обычно делаю, это помещаю все в структуру Members в классе, кроме того, что не копируется. Как это:

class Location
{
   struct Members
   {
      int var1, var2;
   };

   Members m;
   CArray m_LocationsToSkip;

public:
   Location& operator=(Location const& rhs);
};

Location& Location::operator=(const Location &rhs) 
{
    // Only do assignment if RHS is a different object from this.
    if (this != &rhs) 
    {
        //Copy CArray
        m_LocationsToSkip.Copy(rhs.m_LocationsToSkip);

        //Copy rest of member variables
        m = rhs.m; //will use Members automatically generated operator=
                   //which should do the correct thing because you only put
                   //normally copyable members in m
    }

    return *this;
}

Я впервые написал об этом здесь: https://stackoverflow.com/questions/469696/what-is-your-most-useful-c-c-utility/1609496#1609496

0 голосов
/ 15 января 2012

Обычно это делается с помощью так называемой «идиомы копирования и обмена». Вы реализуете конструктор копирования и метод swap(), который обменивается значениями элементов и, что наиболее важно, указателями на внешние данные. При этом ваш оператор присваивания выглядит так:

C& C::operator=( const C& c ) {
    C tmp( c );
    this->swap( tmp );
    return *this;
}

Вам даже не нужен самозванец с этим.

0 голосов
/ 15 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...