Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 14
1

Перемещающий конструктор и оператор перемещающего присваивания

20.12.2016, 14:42. Показов 5074. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Правильно у меня написаны перемещающий конструктор и оператор присваивания? И исправьте ошибку в операторе
"ссылка rvalue не может быть привязана к lvalue"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class MyClass
{
private:
    int a;
    double b;
 
public:
    MyClass()
    {
        a = 0;
        b = 0.0;
    }
 
    MyClass(const MyClass &rhs)
    {
        a = rhs.a;
        b = rhs.b;
    }
    
    MyClass(MyClass &&rhs)
    {
        a = rhs.a;      // Правильно?
        b = rhs.b;      // ...
    }
 
    MyClass& operator=(const MyClass &rhs)
    {
        a = rhs.a;
        b = rhs.b;
 
        return *this;
    }
 
    MyClass&& operator = (MyClass &&rhs)
    {
        a = rhs.a;      // Правильно?
        b = rhs.b;      // ...
 
        return *this;   // Ошибка ссылка rvalue не может быть привязана к lvalue
    }
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2016, 14:42
Ответы с готовыми решениями:

Перемещающий оператор присваивания
В каких ситуациях вызывается перемещающий оператор присваивания, я нашел только один. int main()...

Копирующий/перемещающий оператор и конструктор
Мне вообщем надо сделать копирующие и перемещающие операторы присваивания и конструкторы.Я...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор *
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор...

Конструктор копирования и оператор присваивания
Не понимаю, когда используется один, а когда другой. Написал простой пример с комплексными числами...

5
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
20.12.2016, 14:56 2
Лучший ответ Сообщение было отмечено Index1 как решение

Решение

Цитата Сообщение от Index1 Посмотреть сообщение
C++
1
2
3
4
5
6
7
    MyClass&& operator = (MyClass &&rhs)
    {
        a = rhs.a;      // Правильно?
        b = rhs.b;      // ...
 
        return *this;   // Ошибка ссылка rvalue не может быть привязана к lvalue
    }
C++
1
2
3
4
5
6
    MyClass& operator = (MyClass &&rhs)
    {
        a = rhs.a;
        b = rhs.b;
        return *this;
    }
Цитата Сообщение от Index1 Посмотреть сообщение
C++
1
2
3
4
5
    MyClass(MyClass &&rhs)
    {
        a = rhs.a;      // Правильно?
        b = rhs.b;      // ...
    }
C++
1
2
3
    MyClass(MyClass &&rhs)
        : a(rhs.a), b(rhs.b) 
    { }
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
20.12.2016, 14:57 3
Лучший ответ Сообщение было отмечено Index1 как решение

Решение

Как минимум
C++
1
2
3
4
5
6
7
 MyClass& operator = (MyClass &&rhs)
    {
        a = rhs.a;      // Правильно?
        b = rhs.b;      // ...
 
        return *this;   // Ошибка ссылка rvalue не может быть привязана к lvalue
    }
C++
1
MyClass(MyClass &&rhs):a(rhs.a),b(rhs.b){}
Опередили немного
0
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 14
20.12.2016, 15:05  [ТС] 4
Благодарю
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
20.12.2016, 16:34 5
Лучший ответ Сообщение было отмечено Index1 как решение

Решение

Цитата Сообщение от Index1 Посмотреть сообщение
Правильно у меня написаны перемещающий конструктор и оператор присваивания?
Если уж пишем функции перемещения, то не забываем про noexcept иначе контейнеры ничего перемещать не будут при резайзинге:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class MyClass
{
    int a = 0;
    double b = 0.0;
 
public:
    MyClass() = default;
 
    MyClass(const MyClass &rhs) : a(rhs.a), b(rhs.b)
    {
        //puts(__PRETTY_FUNCTION__);
    }
 
    MyClass(MyClass &&rhs) noexcept : a(rhs.a), b(rhs.b)
    {
        puts(__PRETTY_FUNCTION__);
        rhs.a = 0;
        rhs.b = 0.0;
    }
 
    MyClass& operator=(const MyClass &rhs)
    {
        a = rhs.a;
        b = rhs.b;
 
        return *this;
    }
 
    MyClass& operator = (MyClass &&rhs) noexcept
    {
        puts(__PRETTY_FUNCTION__);
        a = rhs.a;
        b = rhs.b;
        rhs.a = 0;
        rhs.b = 0.0;
 
        return *this;
    }
};
 
int main()
{
    std::vector<MyClass> v;
    v.reserve(4);
    for (int i = 0; i < 17; ++i)
    {
        std::cout << "size: " << v.size() << ", capacity: " << v.capacity() << '\n';
        MyClass mc;
        v.push_back(mc);
    }
}
Без noexcept все будет копироваться.
2
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 14
20.12.2016, 18:27  [ТС] 6
notAll, да мне бы как-нибудь написать, я сегодня только начал изучать перемещающие конструкторы и присваивания. Главное работает и хорошо, для начала этого вполне хватит. А так все равно спасибо за совет, на будущее учту про noexcept
0
20.12.2016, 18:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2016, 18:27
Помогаю со студенческими работами здесь

Конструктор копирования и оператор присваивания
Есть класс (синтетический, создан для примера) class Object { private: int a; float...

Конструктор копий. Оператор присваивания
В классе есть массив char (не динамический) размером 40 байт. Вопрос1: нужно ли для такого класса...

Оператор присваивания через конструктор
Здравствуйте! Насколько плохо (или совсем не плохо) реализовывать операторы присваивания через...

Оператор присваивания через конструктор копирования
Возник такой вопрос. Как перегрузить оператор присваивания для класса через конструктор...

Про конструктор копирования, оператор присваивания
Объясните, пожалуйста, принцип действия конструктора копирования и операции присваивания. На что...

Очередь, конструктор копирования и перегруженный оператор присваивания
#include &lt;iostream&gt; using namespace std; typedef char type; struct Node { type element;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru