Я пытаюсь связать разделяемую библиотеку в Python, используя pybind11.
Я создал упрощенную версию, которая иллюстрирует проблему. Из python я вызываю функцию foobar . Эта функция вызывает статическую функцию, которая вызывает фабрику, которая снова вызывает фабрику, которая создает Singleton.
Это прекрасно работает, когда я запускаю код как исполняемый файл (без использования связывателя). Проблема в том, что когда библиотека используется со связывателем через Python, синглтон создается дважды (например, при каждом использовании синглтона). Однажды в конструкторе Factory2 и позже в функции foobar .
Я уже попробовал то, что предлагают другие решения, скрывая фабрики, но это не сработало, или я мог реализовать это неправильно.
Любые идеи о том, как это можно решить, поэтомучто синглтон создается только один раз? Любая помощь будет принята с благодарностью!
Я создал небольшой пример, иллюстрирующий проблему.
Main.cpp:
int foobar(){
Singleton::createModel();
Singleton::getModel(); //SECOND CALL TO CONSTRUCTOR
return 0;
}
Singleton.h:
class Singleton {
public:
static void createModel(){
Factory factory;
}
static void setModel(Model *model) {
Singleton::getInstance().model = model;
}
static Model *getModel() {
return Singleton::getInstance().model;
}
private:
static Singleton &getInstance() {
static Singleton instance;
return instance;
}
Singleton() : model(nullptr) {};
~Singleton() {};
Model *model;
};
Factory.h:
class Factory {
public:
Factory(){
Factory2 factory2;
}
};
Factory2.h:
class Factory2 {
public:
Factory2();
};