Правило 0
#новичкам
Правило 5 говорит нам определять все 5 специальных методов, если нам нужно определить хотя бы 1 из них.
Но как часто вам сейчас реально нужно определять специальные методы? Возможно в каком-то библиотечном или фреймворкочном коде это встречается почаще. Но чем выше уровень абстракций в коде, тем ниже вероятность встретить определение специальных методов.
Почему?
Язык уже сейчас богат на различные средства управления ресурсами. Есть стандартные контейнеры, есть умные указатели. Они уже внутри себя определяют семантику владением ресурсом и предоставляют простой интерфейс для работы с ними.
Нам не обязательно писать все руками(если не нужно выжимать микросекунды и килобайты памяти).
Для управления ресурсами можно пользоваться готовыми инструментами и сфокусироваться на логике приложения.
Именно об этом и говорит правило 0.
Если вы пользуетесь обертками управления ресурсами и вас устраивает дефолтное поведение компилятора при операциях с объектами, то вам не нужно определять ни одного специального метода.
class rule_of_zero
{
std::string cppstring;
public:
rule_of_zero(const std::string& arg) : cppstring(arg) {}
};
// std::string will manage resource
Однако иногда есть
один интересный кейс.
Пускай у вас есть полиморфный класс. Да, вы там используете все возможные обертки и хотите использовать правило 0.
Но у вас не выйдет.
Как минимум вы определите виртуальный деструктор и пометите его как default. То есть уже не 0.
И только этот факт вас уже должен насторожить. Потому что могут быть скрытые проблемы. Например, может произойти случайный слайсинг полиморфного объекта при передаче по значению. Чтобы избежать неприятностей, вам нужно удалить мув и копи операции.
class Base {
public:
virtual ~Base() = default;
Base(const Base&) = delete;
Base& operator=(const Base&) = delete;
Base(Base&&) = delete;
Base& operator=(Base&&) = delete;
// ... other constructors and functions ...
};
В этом случае вы попали четко в правило 5: даже такая синтаксическая необходимость дефолтирования виртульного деструктора должно вам настрожить, подумать о последствиях и в итоге прийти к определению всех 5 методов.
Follow the rules. Stay cool.
#design #goodpractice
Обсуждение 1
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram