не удается создать объект mongocxx::instance, если он уже был создан

#c #mongodb

#c #mongodb

Вопрос:

Я создал класс для вызова и тестирования mongo-cxx-driver и создаю mongocxx::instance в своем конструкторе.

 MongoDBHelper::MongoDBHelper()
{
    mongocxx::instance inst{};
}
  

Проблема в том, что когда я инициализирую второй экземпляр моего класса object, оказывается:

 cannot create a mongocxx::instance object if one has already been created
  

было бы немного странно, если бы я поместил mongocxx::instance в глобальную область видимости или использовал std::call_once . Как я могу это исправить?

Комментарии:

1. Почему бы не сделать его статической переменной класса, если global кажется странным? Похоже, что он хочет, чтобы его обрабатывали как одноэлементный экземпляр.

Ответ №1:

из :http://mongocxx.org/api/current/classmongocxx_1_1instance.html

Класс, представляющий экземпляр драйвера MongoDB.

Конструктор и деструктор инициализируют и завершают работу драйвера соответственно. Следовательно, экземпляр должен быть создан перед использованием драйвера и должен оставаться активным до тех пор, пока все остальные объекты mongocxx не будут уничтожены. После запуска деструктора экземпляра драйвер может не использоваться.

В данной программе должен быть создан ровно один экземпляр. Не создание экземпляра или создание более одного экземпляра в программе являются ошибками, даже если несколько экземпляров имеют неперекрывающиеся сроки службы.

Кажется, у вас не может быть 2 экземпляра, но, возможно, вы можете создать / уничтожить один, а затем воссоздать / уничтожить другой.

Откуда взялся ваш первый экземпляр?

Комментарии:

1. «даже если несколько экземпляров имеют неперекрывающиеся сроки службы» означает, что это не позволит вам воссоздать его

2. Ну, так что статический / одноэлементный / глобальный принудительно создается дизайном

3. К сожалению, да. Библиотеки, от которых зависит mongocxx, в свою очередь, применяют семантику одноэлементной инициализации, поэтому мы мало что можем сделать. Я бы предпочел создать библиотеку без состояния, но я был вынужден пойти на компромисс.

4. В какой-то момент вы действительно могли уничтожить и заново создать экземпляр, но эта функция была удалена последующим сопровождающим, потому что, по-видимому, базовый драйвер C не может с этим справиться: github.com/mongodb/mongo-cxx-driver/commit /…