Описание тега rule-of-five

1 ответ

Почему класс с явно объявленным конструктором перемещения не выполняет std::is_move_constructible_v?

Библиотека, которую я использую, требует, чтобы классы, используемые с ее шаблонами, могли быть перемещаемыми и назначаемыми по различным внутренним причинам. Я написал класс и дал ему явный конструктор перемещения. #pragma once #include <entt.hp…
26 июл '20 в 02:26
3 ответа

Как интеллектуальные указатели влияют на правило пяти?

Я узнал, что, когда вы используете указатели в классе, вы должны реализовать правило 5. Если вы не используете указатели, тогда все в порядке, и на самом деле это предпочтительнее использовать значения по умолчанию. Однако как это работает с интелле…
1 ответ

Виртуальный деструктор базового класса - правило пяти?

У меня есть база State класс интерфейса с виртуальным деструктором по умолчанию. class State { public: virtual void event() = 0; virtual ~State() = default; // relevant part virtual void onCreate() {} virtual void onDestroy() {} virtual void onActiv…
24 май '20 в 13:50
1 ответ

Правило пяти для класса BST в C++

Я реализую класс двоичного дерева поиска, и мне было интересно, правильно ли реализованы мои конструкторы перемещения / копирования и операторы присваивания. (Кажется, все работает правильно, но я впервые использую эти конструкторы и операторы присв…
2 ответа

std::vector с элементами, размещенными в куче - мне нужно правило 5?

Если у меня есть класс с такими членами: class MyClass { public: void set_my_vector() { for (int ind = 0; ind < 3; ++ind) { my_vector.push_back(new MyStruct(i, i*2)); } } private: struct MyStruct { int num_a; int num_b; MyStruct(int i, int j) : n…
08 сен '20 в 07:29
1 ответ

В чем разница между объявлением конструктора копирования с помощью "= default" или его отсутствием вообще?

Я пытаюсь понять поведение автоматически сгенерированного кода компилятора для различных функций, таких как: деструктор конструктор копирования оператор присваивания переместить конструктор оператор присваивания перемещения Будет ли их объявление с …
0 ответов

Правило C++ из 5 в чем смысл копирования

У меня есть назначение копии для оружия, у которого есть массив указателей для вложений оружия (класс вложения), я не вижу смысла в назначении копии, потому что после клонирования пистолета с конструктором копирования мне никогда не понадобится назн…
18 май '21 в 13:35
0 ответов

Правило пяти при использовании полиморфизма

Я пытаюсь понять правило пяти при использовании интерфейсов (во всяком случае, концепции) и абстрактных классов и изо всех сил пытаюсь понять, как работают правила. Предположим, у меня есть такой макет: #include <memory> #include <optional&…
05 июл '21 в 23:13
1 ответ

Какой минимальный класс следует расширить для типа без копирования / без перемещения?

Скажем, я хочу создать несколько классов для управления ресурсами, которые не следует копировать или перемещать, что было бы минимальным классом, который нужно расширять и избегать ошибок? Идея в том, что, расширяя класс, я на безопасную сторону пер…
30 авг '21 в 13:48
1 ответ

Является ли это правильной реализацией правила пяти (или правила четырех и 1/2)?

Я изучаю правило пяти и его кузенов (правило четырех и 1/2, идиома копирования и обмена, функция обмена друзьями). Я применил Правило четырех и 1/2 на тестовом классе. Он хорошо компилируется. Есть ли скрытая ошибка в моей реализации? Меня особенно …
29 янв '22 в 18:32
2 ответа

Определение интерфейсов (абстрактных классов без элементов) в C++

Под интерфейсом (терминология C#) я подразумеваю абстрактный класс без элементов данных. Таким образом, такой класс указывает только контракт (набор методов), который должны реализовать подклассы. Мой вопрос:как правильно реализовать такой класс в с…
0 ответов

С++ Правило 5 с реализацией наследования

Следуя примерам из онлайн-руководств по правилам 5, я написал этот класс: #include <iostream> #include <cstring> #include <utility> class A2 { char* _buff; public: A2(const char *text = "test") { std::cout << "New A2\n"; _buf…
06 сен '21 в 09:36
0 ответов

Реализовать оператор присваивания С++ с точки зрения конструктора

Фон Предположим, вы хотите реализовать класс управления ресурсами на C++. Вы не можете использовать правило нуля или правило пяти значений по умолчанию , поэтому вам действительно нужно реализовать конструктор копирования и перемещения, оператор при…
30 ноя '21 в 21:46
0 ответов

С++ PIMPL с использованием std::unique_ptr и правила пяти

Если у вас есть класс C++ с pimpl, использующий std::unique_ptr, и решение того факта, что класс pimpl неполный в заголовке, объявляя мой собственный деструктор (я знаю, что мог бы также предоставить собственный деструктор, но давайте использовать d…
09 апр '22 в 14:10
0 ответов

Правила Ноль/Пять/Шесть нарушены?

Операции присваивания должны быть квалифицированы ссылкой - и вопрос здесь не в том, "есть ли смысл присваивать rvalue", а в правильности. По умолчанию операции присваивания возвращают ссылки lvalue. Следовательно, следующий код действителен Class A…
1 ответ

Какова связь между правилом пяти, наследованием и полиморфизмом в C++?

Я изучал деструкторы, конструкторы копирования, конструкторы перемещения и все остальное. Я также узнал рекомендацию о том, чтобы пометить ваш деструктор как виртуальный в базовом классе, от которого унаследованы производные классы. Согласно правилу…
13 дек '22 в 06:40
1 ответ

Могут ли операции присваивания, объявленные по умолчанию, иметь квалификаторы ссылок?

При объявлении операций присваивания какdefault, есть ли что-то неправильное в том, чтобы сделать их квалифицированными ссылками, чтобы предотвратить присвоение временным? (Чаще всего это предотвращает глупые ошибки). Общие ресурсы ничего не говорят…
10 ноя '22 в 11:17
1 ответ

Нужно ли здесь соблюдать правило пяти?

Итак, на https://en.cppreference.com/w/cpp/language/rule_of_three написано: Поскольку наличие определяемого пользователем (или = объявленного по умолчанию или = объявленного удаления) деструктора, конструктора копирования или оператора присваивания …
22 июн '22 в 02:36
1 ответ

Как мне поступить с деструктором при создании пользовательского вектора с помощью класса шаблона?

Я попытался создать свой собственный класс Vector с классом шаблона. я ожидаю, что я могу положить мойVector<int>вVector<Vector<int>>переменная. По крайней мере, это то, на что я надеялся ... но он продолжает падать в коде деструкт…
10 июн '22 в 08:38
0 ответов

C++ - clang tidy жалуется на правило X?

Этот код вызывает предупреждение в clang tidy: Класс «Locker» определяет деструктор не по умолчанию, но не определяет конструктор копирования, оператор присваивания копии, конструктор перемещения или оператор присваивания перемещенияclang-tidy(cppco…
17 фев '23 в 08:48