В старом недобром С++03 нужно для классов было определять: копирующий констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с перемещением. Уже достаёт — в классе из четырёх строчек получается строк 20 стандартного кода.
А ещё есть операторы сравнения и присваивания. Что есть хорошего, разумного, вечного для одоления этого недуга?
Здравствуйте, Cyberax, Вы писали:
C>В старом недобром С++03 нужно для классов было определять
Не нужно, а можно. И если поведение должно отличаться от дефолтового, то что иначе как не писать код? Компиляторы других языков читают мысли программиста?
Здравствуйте, Хвост, Вы писали:
C>>В старом недобром С++03 нужно для классов было определять Х>Не нужно, а можно. И если поведение должно отличаться от дефолтового, то что иначе как не писать код? Компиляторы других языков читают мысли программиста?
Да, я подразумеваю value-классы, понятное дело.
Здравствуйте, dilmah, Вы писали:
D>в гугл-стайл большинство классов включают макрос DISALLOW_COPY_AND_ASSIGN или DISALLOW_EVIL_CONSTRUCTORS
Плевать на гугл-стайл.
Здравствуйте, Cyberax, Вы писали:
C>Достало писать кучу boilerplate'а.
C>В старом недобром С++03 нужно для классов было определять: копирующий констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с перемещением. Уже достаёт — в классе из четырёх строчек получается строк 20 стандартного кода.
в С++11 добавили "=default;"
Что качается остального, единственный вариант — это переходить на другой язык. Или принять реальность такой какая она есть, и не писать сюда того что и без вас все знают. Да, все ненавидят С++, но юзают его потому что других вариантов-то сейчас нету.
Здравствуйте, Abyx, Вы писали:
C>>В старом недобром С++03 нужно для классов было определять: копирующий констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с перемещением. Уже достаёт — в классе из четырёх строчек получается строк 20 стандартного кода. A>в С++11 добавили "=default;"
Вот как раз то что нужно. Жаль, что в MSVC не поддерживается.
Здравствуйте, Cyberax, Вы писали:
C>В старом недобром С++03 нужно для классов было определять: копирующий констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с перемещением. Уже достаёт — в классе из четырёх строчек получается строк 20 стандартного кода.
А шо делать?
C>А ещё есть операторы сравнения и присваивания. Что есть хорошего, разумного, вечного для одоления этого недуга?
Visual Assist для генерации объявлений в хедере и заглушек реализации в *.cpp
Особенно удобно при подходе, кода одна пара *.h/*.cpp определяет один класс и имя класса совпадает с именем файла.
Здравствуйте, landerhigh, Вы писали:
C>>В старом недобром С++03 нужно для классов было определять: копирующий констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с перемещением. Уже достаёт — в классе из четырёх строчек получается строк 20 стандартного кода. L>А шо делать?
Набросал макросы пока что. Что-то типа такого получается:
struct point {
int x, y;
DEF_VALUE_OBJECT(point, (x)(y));
};
Здравствуйте, Cyberax, Вы писали:
C>В старом недобром С++03 нужно для классов было определять: копирующий констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с перемещением.
А также добавился
= default;
C> Уже достаёт — в классе из четырёх строчек получается строк 20 стандартного кода.
C>А ещё есть операторы сравнения и присваивания. Что есть хорошего, разумного, вечного для одоления этого недуга?
= default
C>Заодно вечная проблема с дублирующимися методами: C>
Ну тут извините, совершенно разное использование подразумевается. Неконстантный get_str это уже не геттер вовсе, он подразумевает что строку будут таким образом менять.
On 12/14/2011 01:57 AM, Cyberax wrote:
> В старом недобром С++03 нужно для классов было определять: копирующий > констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В > С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с > перемещением. Уже достаёт — в классе из четырёх строчек получается строк 20 > стандартного кода.
Так это ж не в каждом классе нужно писать. И конструкторы, и операторы
присваивания нужно писать только там, где это реально нужно.
Здравствуйте, alsemm, Вы писали:
A>Перегружать разные по логике методы — это диверсия.
Это не диверсия, а не более чем перверсия, родом из STL (см. begin(), end(), front(), back())
Её смысл — только в углублении константности.
У прямых членов-данных константность глубокая (константность хозяина влечёт константность элементов), у косвенных (включая вычисляемые) — поверхностная. Если хочется эмулировать глубокую константность для косвенных членов, приходится делать вот так.
Заметим, что в примере с get_str мы не снимаем константность, а накладываем, т.е. делаем более строгий контракт.
Предположительно, str_ объявлен как string& либо mutable string.