Я только что узнал о RAII. Насколько я понимаю, определение RAII содержится в самом его названии. Например, (пусть A будет классом) рассмотрим следующую функцию ниже:
void foo(){
A a;
a.init();
// Do stuff with a.
a.destroy();
}
Применив RAII к приведенной выше функции, мы получим:
void foo(){
// Initializing the resource completely in a consttructor.
A a;
// Do stuff with a.
// When out of scope, the destructor should be called.
}
Таким образом, RAII является хорошим рабочим процессом разработки программного обеспечения, поскольку он снижает количество ошибок разработчика, поскольку использует вызовы конструктора/деструктора для инициализации и освобождения ресурсов.
Проблема:
Предположим, у меня есть класс с несколькими конструкторами и содержит элементы данных, которые не имеют конструктора без аргументов для принудительной реализации RAII. Рассмотрим класс ниже:
class A{
public:
A(int arg1){
int(arg1, GLOBAL_CONSTANT);
}
A(int arg1, arg2){
init(arg1, arg2);
}
void init(int arg1, int arg2){
_member = B(arg1, arg2);
}
private:
B _member; // No-arg constructor member.
};
Поскольку B также реализует методологию RAII, у него нет конструктора без аргументов, чтобы заставить пользователя не использовать метод init() позже, поэтому _member должен быть инициализирован в списке конструкторов вместо init, что делает класс выше ошибочным.
Вопрос:
Как именно вы справляетесь с этим? Каков отраслевой стандарт решения этой проблемы, если он вообще существует?
Я вижу важность RAII и не хочу идти на компромисс. Прямо сейчас самое чистое решение в моей голове — иметь один конструктор и использовать фабричный метод для создания вариантов. Но я не хочу спешить и сначала учитываю опыт других, иначе я просто создам неприятный код.