Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 27.11.2021
Сообщений: 129

конструктор перемещения

18.07.2022, 15:50. Показов 958. Ответов 6

Студворк — интернет-сервис помощи студентам
Добрый день. Пишу конструктор перемещения для своего класса. В классе содержится переменная типа перечисления. Подскажите пожалуйста, как её обнулить?

Мой класс:
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
class Animal
{
public:
    enum Sex {MALE, FEMELE};
 
private:
    unsigned int m_age; // возраст животного
    bool m_bHasMaster;  // наличие хозяина
    Sex m_sex;          // пол животного
    char* m_pName;      // имя животного
 
public:
    //Animal() // конструктор по умолчанию
    //{
    //  m_age = 0;
    //  m_bHasMaster = false;
    //  m_sex = MALE;
    //  const char* pName = "B";
    //  m_pName = new char[strlen(pName) + 1];
    //  strcpy(m_pName, pName);
    //}
    
    Animal(unsigned int age = 0, bool master = false, Sex sex = MALE, const char* pName = "Bobic")
    {
        m_age = age;
        m_bHasMaster = master;
        m_sex = sex;
        m_pName = new char[strlen(pName)+1];
        strcpy(m_pName, pName);
    }
 
    Animal(int age, bool master, Sex sex, const char* pName); // конструктор с параметрами
    Animal(const Animal& other); // конструктор копирования
    Animal(Animal&& other); // перемещающий конструктор 
    ~Animal(); // деструктор
 
    void SetAge(int a); // присваиваем значение переменной m_age
    char* GetName();    // принимаем значение переменной m_pName
    void ChangeSex();   // меняем значение переменной m_sex на противоположное
};
Конструктор перемещения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
Animal::Animal(Animal&& other)
{
    m_age = other.m_age;
    other.m_age = 0;
    m_bHasMaster = other.m_bHasMaster;
    other.m_bHasMaster = false;
    m_sex = other.m_sex;
    other.m_sex = NULL; 
 
    m_pName = other.m_pName;
    other.m_pName = nullptr;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2022, 15:50
Ответы с готовыми решениями:

Конструктор перемещения
Правильно написан конструктор, значения в right нужно обнулять или не нужно? class Test { private: int count_; // Кол-во...

Конструктор перемещения
Здравствуйте, пытаюсь уже некоторое время разобраться с move-семантикой. Честно говоря возникли сложности сразу же. Помогите пожалуйста...

C++11 Конструктор перемещения
Добрый день. Решил тут познакомится с конструктором перемещения, и сразу протестировал кое-что. Конструктор перемещения просто изымает...

6
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
18.07.2022, 16:27
Цитата Сообщение от Nik_787 Посмотреть сообщение
Подскажите пожалуйста, как её обнулить?
1) Зачем ее обнулять?
2) У вас за "обнуленное" значение, судя по уже написанному коду, принимается значение MALE.
0
2 / 2 / 0
Регистрация: 27.11.2021
Сообщений: 129
18.07.2022, 16:33  [ТС]
Мне нужно, что бы в старом объекте ничего не осталось.

Добавлено через 1 минуту
Как я понимаю в этом вся суть перемещающего конструктора.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
18.07.2022, 16:42
Лучший ответ Сообщение было отмечено Nik_787 как решение

Решение

Цитата Сообщение от Nik_787 Посмотреть сообщение
Мне нужно, что бы в старом объекте ничего не осталось.
Так не бывает.

Цитата Сообщение от Nik_787 Посмотреть сообщение
Как я понимаю в этом вся суть перемещающего конструктора.
Суть перемещающего конструктора в том, чтобы оставить в прежнем объекте валидное состояние, выполнив при этом перенос данных в новый объект наиболее эффективным способом. Для элементарных типов, в том числе enum`ов, наиболее эффективный способ - это простое копирование.
1
2 / 2 / 0
Регистрация: 27.11.2021
Сообщений: 129
18.07.2022, 16:50  [ТС]
Спасибо!!!
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
18.07.2022, 18:20
Цитата Сообщение от DrOffset Посмотреть сообщение
выполнив при этом перенос данных в новый объект наиболее эффективным способом
или наиболее безопасный, а при этом нужно затереть данные которые перенес. есть же прикол с упразднением функции memset, если она находиться в конце функции и затирает данные автоматических переменных. нам статический анализатор сказал, что это не безопасно, так как по стандарту это дело компилятор может оптимизировать и на стеке останутся данные.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
18.07.2022, 20:18
_stanislav, обычно в исходном объекте ничего "затирать" не надо. Это "затирание" - лишние накладные расходы. Главное обеспечить корректную передачу владения ресурсами, все остальное допустимо оставить в том виде, в котором оно было.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.07.2022, 20:18
Помогаю со студенческими работами здесь

Конструктор перемещения
Здравствуйте. У меня есть такой класс: class Organization { char *name; int year, staffQual; double salaryFund;

Конструктор перемещения
#include <iostream> #include <memory> using namespace std; class A { int x; public: A(int _x) : x(_x){}; ...

Конструктор перемещения и оптимизация
Имеем тестовый код: #include <iostream> using namespace std; struct A { A( int v ) { cout <<...

Не срабатывает конструктор перемещения
Есть класс у которого удалён конструктор перемещения. Но тем не менее, при передаче обьекта данного класса в функцию по rvalue ссылке через...

Не работает конструктор перемещения (C++11)
Прив. Пишу класс подобный string'гу, ну и в процессе изучаю C++. Добрался до оператора и конструктора перемещения. #include...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru