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

The rule of three (also known as the Law of The Big Three or The Big Three) is a rule of thumb in C++ that claims that if a class defines one of the following it should probably explicitly define all three: destructor, copy constructor, assignment operator
1 ответ

Ошибки шаблона C++ с разными типами

Мне нужно найти все возможные, как минимум три, ошибки из следующего. template<typename A, typename B, typename C> C myfunction(const A& a, const B& b) { if ( a < b ) return (C) a; else return (C) b; } Мой ответ был Типы A и B могут…
0 ответов

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

Я новичок в C++ и пытаюсь написать класс CarRental, который содержит вектор указателей на базовый класс Car. Вот класс автомобилей. class Car{ public: Car():mPlate(""), mBrand(""){}//constructor Car(string p, string b): mPlate(p), mBrand(b){} //cons…
1 ответ

Действительно ли безопасно не проверять в операторе copy assignemt, присваивается ли объект самому себе?

Вот пример реализации "Правила трех", который я нашел: class Array { public: int size; int* vals; Array() : size(0), vals(NULL){} Array( int s, int* v ); Array(const Array&); // 1 Array& operator=(const Array&); // 2 ~Array(); // 3 }; Ar…
10 дек '18 в 22:01
3 ответа

Правило трех в C++

Я читал, что правило трех, что такое правило трех? резюмируется следующим образом: Если вам нужно явно объявить деструктор, конструктор копирования или оператор копирования, вам, вероятно, нужно явно объявить все три из них. Мой вопрос: в приложении…
13 июн '12 в 22:47
2 ответа

Правило трех упражнений неожиданный результат

Я стараюсь изучать основы C++ в свободное время и следую упражнениям из книги. Во-первых, когда я ввожу 9 как строку и 8 как столбец, я получаю ошибку освобождения malloc. Во-вторых, я получаю 0 в качестве вывода, я не вижу, что я ввожу. Я хочу напи…
3 ответа

Исключение из правила трех?

Я много читал о правиле трех в C++. Многие клянутся этим. Но когда правило сформулировано, оно почти всегда включает слово "обычно","вероятно" или "вероятно", указывающее на наличие исключений. Я не видел много дискуссий о том, какими могут быть эти…
1 ответ

Обнаружено повреждение кучи после нормального блока (#181)

(прежде всего извините за английский, потому что я не очень хорош в этом) Я написал код для магического квадрата, который отлично работает и дает истинный квадрат. Когда он скомпилирован и я запускаю программу, в этом нет ничего плохого. Но когда он…
05 ноя '16 в 12:19
2 ответа

Рекурсивный вызов в конструкторе копирования

Я реализовал класс, следуя правилу трех, и получаю сбой. После отладки я пришел к выводу, что конструктор копирования вызывает сам себя несколько раз вместо вызова оператора равенства. Почему это так? Разве это не должно вызывать оператор равенства?…
0 ответов

C++ вектор теряет кучу выделенного указателя

Я написал простую программу ниже для объяснения. class A{ public: int *x; A(){ x = 0; } ~A(){ delete x; } void foo(){ x = new int(); *x = 99; } }; int main(){ std::vector<A> as; for (int i = 0; i < 3; ++i){ as.push_back(A()); as.back().foo(…
02 дек '15 в 10:09
2 ответа

C++ - Для вектора указателей на объект перераспределение вызывает удаление и копирование объектов?

Насколько я понимаю, если у вас есть вектор объектов класса, если вы удаляете какой-либо элемент вектора, обычно вектор перераспределяет некоторые из своих объектов, чтобы сохранить смежность памяти. Следовательно, вам нужно реализовать правило трех…
28 мар '14 в 01:52
8 ответов

Что такое правило трех?

Что означает копирование объекта? Что такое конструктор копирования и оператор присваивания копии? Когда я должен объявить их сам? Как я могу предотвратить копирование моих объектов?
1 ответ

Правило трех. Конструктор копирования, реализация оператора присваивания

Правило трех. Конструктор копирования, реализация оператора присваивания #include <iostream> using namespace std; class IntPart { public: IntPart(); // default constructor IntPart(int n); private: unsigned int* Counts; unsigned int numParts; u…
2 ответа

C++ деструкторы, динамическое размещение

Недавно у меня были некоторые ошибки (bad_alloc) из-за отсутствия деструктора. В настоящее время у меня есть два класса, настроенные таким образом: class ObjOne { friend class ObjTwo; public: //constructors and some other random methods ObjOne(int n…
1 ответ

C++: идиома копирования и замены, альтернативный конструктор

NB: Этот вопрос следует за предыдущим, я надеюсь, что все еще можно задавать его как новый вопрос. Я пытаюсь реализовать "правило трех с половиной" (идиома копирования и замены) для класса дерева, который выглядит следующим образом: class Tree { fri…
09 авг '13 в 04:20
1 ответ

C++ Перегрузочный оператор присваивания для ошибки динамического многомерного массива

У меня проблемы с перегрузкой оператора = динамическими массивами. Это то, что я до сих пор. Также я знаю, что не написал свой деструктор или конструктор, но сначала мне нужно сосредоточиться на этом операторе: В моем заголовочном файле: #ifndef fas…
2 ответа

Ошибка сегментации; правило трех

У меня есть такой файл заголовка #ifndef __coulomb_h_ #define __coulomb_h_ #include "nml_dcvector.h" #include <fstream> #include <iostream> #include <complex> #include <vector> using namespace std; class Coulomb{ public: type…
18 мар '15 в 03:18
1 ответ

Заставьте 2 нестатических поля (которые являются динамическими массивами) использовать память рядом друг с другом

Позволять B1 а также B2 быть классами хранения динамического размера. (например B1~std::vector<char> B2~std::vector<float>) В C++11, если я кодирую B1 а также B2 "s move а также copy функция (правило пяти), класс C который содержит их ка…
11 сен '17 в 08:06
0 ответов

Должен ли интерфейс C++ подчиняться правилу пяти?

Как правильно объявлять методы создания экземпляров при определении класса интерфейса? Абстрактные базовые классы должны иметь виртуальный деструктор по очевидным причинам. Однако затем выдается следующее предупреждение компиляции: "InterfaceClass о…
1 ответ

Программа аварийного завершения конструктора копирования Linked List

Я не уверен в том, почему мой конструктор копирования, похоже, приводит к сбою программы, все остальные функции были в порядке в классе связанного списка. Правило 5 действительно смущает меня сейчас реализацией. Если у кого-то есть указания или указ…
1 ответ

Почему удаление указателя Actor приводит к тому, что "Program.exe вызвал точку останова"

Я пытаюсь создать Actor указатель, указывающий на другого Actor объект, вот так: Actor other = Actor(); Actor* ptr = &other; А потом, когда я пытаюсь delete ptr, это приводит к ошибке во время выполнения: Program.exe вызвал точку останова Но ког…