Использование автоматической деконструкции объекта в качестве инициализации и очистки библиотеки - PullRequest
0 голосов
/ 08 января 2019

Идея использования автоматической деконструкции объектов для распределенных объектов в стеке заставила меня задуматься об использовании системы как способа инициализации и очистки сторонних библиотек.

Пример:

#include <libA.h>
#include <libB.h>

namespace library {
 class Wrapper {
    Wrapper() {
         libA_init();
         libB_init();
    }
     ~Wrapper() {
        libB_exit();
        libA_exit();
     }
  }
}
int main() {
    library::Wrapper library;

}

Люди уже спорили о SO, если простое использование автоматического освобождения стека должно называться RAII как RAII без R, это просто способ работы OO. (Распределение - это инициализация? Звучит как вызов конструктора для меня.)

Является ли это использование хорошо известным антипаттерном или хорошей идеей для организации кода?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Вы спросили:

Это хорошо известный антипаттерн или хорошая идея организовать код?

Хорошая идея. Поскольку это проблема управления ресурсами, это действительно чистый и аккуратный способ организации третьего. init / cleanup библиотеки c в стиле party и один, который я видел и использовал раньше.

Хотя в вашем примере есть несколько тонких моментов.

Во-первых, наличие более одного в каждом классе явно нарушает принцип «один класс один».

Во-вторых, если нет веских причин не делать этого, init следует размещать за пределами main (например, непосредственно после определения класса).

0 голосов
/ 08 января 2019

Это хорошо известный антипаттерн или хорошая идея организовать код?

Полностью зависит от объема, который вам необходим для этого.

В целом RAII не является антипаттерном , но предпочтительным шаблоном для использования с c ++.

Возможно, вам нужно позаботиться об автоматически сгенерированных конструкторах копирования и операторах присваивания для library::Wrapper, и вы можете delete явно указать их.

...