Множественный конструктор RAII

Я только что узнал о 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 и не хочу идти на компромисс. Прямо сейчас самое чистое решение в моей голове — иметь один конструктор и использовать фабричный метод для создания вариантов. Но я не хочу спешить и сначала учитываю опыт других, иначе я просто создам неприятный код.


person ComputrScientist    schedule 12.12.2014    source источник


Ответы (1)