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

Правило нуля, как копировать класс, который удовлетворяет правилу нуля?

05.02.2023, 20:15. Показов 916. Ответов 3

Студворк — интернет-сервис помощи студентам
Всем привет. Есть концепция правило нуля, которая гласит, что не стоит реализовывать специальные члены методы класса(то есть конструктор копирования, конструктор перемещения, их операторы и деструктор), а вместо этого все свои указатели сделать умными указателями и они вместо тебя будут уничтожать выделенную память.
Вопрос, как тогда копировать такой класс? если я попробую его скопировать и у меня будет хотя бы один unique_ptr в классе, то будет ошибка компиляции, так как у unique_ptr запрещен конструктор копирования. А если у меня будет shared_ptr в моем классе, то у меня после копирования будет два класса, в которых есть shared_ptr и оба shared-ptr будут указывать на один и тот же объект. Получается концепция правило нуля не позволяет сделать копирования объекта?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2023, 20:15
Ответы с готовыми решениями:

Вычисление числа элементов больше нуля и меньше нуля в двумерном массиве
Здравствуйте, при выполнении программы ругается на a внутри функций: "выражение должно иметь тип указателя на объект, но имеет тип...

Сравнить два массива на чисела: больше нуля, меньше нуля и равно нулю
С помощью множества сравнить два массива на чисел: больше нуля, меньше нуля и равно нулю.

Вычислить среднее арифметическое элементов, расположенных до первого нуля и после последнего нуля
В одномерном массиве, состоящем из п элементов, вычислить: среднее значение элементов, расположенных в массиве между первым последним...

3
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
06.02.2023, 08:43
Цитата Сообщение от NewFive Посмотреть сообщение
Получается концепция правило нуля не позволяет сделать копирования объекта?
Получается, что конкректно unique_ptr и shared_ptr не предназначены для глубокого копирования.
Однако, никто вам не мешает изготовить умный указатель, который будет уметь копироваться.

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
 
template<class t> struct copy_ptr
{
    ~copy_ptr()
    {
        delete resource;
    }
    
    template<class... Args> copy_ptr(Args&& ...args)
        : resource(new t(std::forward<Args>(args)...))
    {}
 
    copy_ptr(copy_ptr& other)
        : resource(new t(*other.resource))
    {}
    
    copy_ptr& operator=(const copy_ptr& other)
    {
        if(this != &other)
        {
            auto* p = new t(*other.resource);
            delete this->resource;
            this->resource = p;
        }
        return *this;
    }
    
    t* operator->() noexcept { return this->resource; }
    
    t* resource;
};
 
struct payload 
{
    payload(const int v) noexcept
        : value(v)
    {
        std::cout << "ctor\n"; 
    }
    
    payload(const payload& other) noexcept
        : value(other.value)
    {
        std::cout << "copy\n"; 
    }
    
    ~payload()
    {
        std::cout << "dtor\n"; 
    }
    
    int value;
};
 
struct sample
{
    copy_ptr<payload> ptr = { 33 };
};
 
int main()
{
    sample s1;
    sample s2 = s1;
    std::cout << s1.ptr->value << '\n';
    std::cout << s2.ptr->value << '\n';    
}
output:
Code
1
2
3
4
5
6
ctor
copy
33
33
dtor
dtor
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,219
06.02.2023, 09:00
Цитата Сообщение от NewFive Посмотреть сообщение
Есть концепция правило нуля, которая гласит, что не стоит реализовывать специальные члены методы класса(то есть конструктор копирования, конструктор перемещения, их операторы и деструктор), а вместо этого все свои указатели сделать умными указателями и они вместо тебя будут уничтожать выделенную память.
Вопрос, как тогда копировать такой класс?
Что значит "как"? Класс, удовлетворяющий Правилу Нуля - просто бери и копируй. Все готово.

Цитата Сообщение от NewFive Посмотреть сообщение
если я попробую его скопировать и у меня будет хотя бы один unique_ptr в классе, то будет ошибка компиляции, так как у unique_ptr запрещен конструктор копирования.
Все правильно. Если класс содержит хотя бы один unique_ptr, то такой класс НЕ удовлетворяет Правилу Нуля.

Цитата Сообщение от NewFive Посмотреть сообщение
А если у меня будет shared_ptr в моем классе, то у меня после копирования будет два класса, в которых есть shared_ptr и оба shared-ptr будут указывать на один и тот же объект.
И? Так и должно быть. В чем проблема? Семантика копирования для shared_ptr именно такова. Все скопировалось правильно.

Если вас не устраивает родная семантика копирования shared_ptr, то либо не надо было использовать shared_ptr, либо вам придется переписать семантику копирования вашего класса, ибо вас не устраивает та, которую предоставляет Правило Нуля.

Цитата Сообщение от NewFive Посмотреть сообщение
Получается концепция правило нуля не позволяет сделать копирования объекта?
Наоборот, Правило Нуля позволяет натуральным образом выполнять копирование объекта на основе натуральной семантики копирования его членов. А устраивает ли вас то "натуральное" копирование, которое получается в результате - это вопрос отдельный.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.02.2023, 10:54
Цитата Сообщение от NewFive Посмотреть сообщение
а вместо этого все свои указатели сделать умными указателями и они вместо тебя будут уничтожать выделенную память.
Правило нуля и данная фраза не связаны между собой. Правило нуля состоит в том, что если ваш класс соответствуют правилу нуля, а вы всё едино нагородили конструкторов и операторов приравнивания, то вы тоже ноль в данном контексте. А умные указатели это о другом. Если вам не нужна динамическая память, а вы тулите умные указатели, то они сразу перестают быть умными.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.02.2023, 10:54
Помогаю со студенческими работами здесь

Для матрицы подсчитать количество элементов, меньших нуля, ровных нулю и больших нуля
Для заданной матрицы A подсчитать количество элементов, меньших нуля, ровных нулю и больших нуля. Для вывода результатов использовать...

Посоветуйте книгу или статью по DirectX с нуля (на языках любых кроме Delphi). С нуля
Посоветуйте книгу или статью по DirectX с нуля (на языках любых кроме Delphi). С нуля. Я сколько не побывал искать, находил и не могу...

Посоветуйте книгу или статью по OpenGL с нуля (на языках любых кроме Delphi). С нуля
Посоветуйте книгу или статью по OpenGL с нуля (на языках любых кроме Delphi). С нуля. Я сколько не побывал искать, находил и не могу...

Какая вероятность того, что сумма этих чисел будет больше нуля, а произведение меньше нуля ?
С отрезка наугад взяли два числа. Какая вероятность того, что их сумма будет больше нуля, а произведение меньше нуля ?

Двухмерный массив. Вычислить количество строк, сумма элементов которых меньше нуля, равна нулю или больше нуля
В двухмерном массиве вычислить количество строк, сумма элементов которых меньше нуля, равна нулю или больше нуля. Добавлено через 7...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru