#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 /…