我正在尝试使用 pybind11 在 Python 中绑定一个共享库。
我创建了一个简化版本来说明问题。从 python 我调用函数foobar。这个函数调用一个静态函数,它调用一个工厂,再调用一个工厂,它构造了 Singleton。
当我将代码作为可执行文件运行(不使用活页夹)时,这可以正常工作。问题在于,当通过 Python 将库与活页夹一起使用时,单例会被构造两次(即,每次使用单例时)。一次在Factory2的构造函数中,然后在foobar函数中。
我已经通过隐藏工厂尝试了这里建议的其他解决方案,但这没有用,或者我可能实施错了。
关于如何解决这个问题的任何想法,以便单例只构建一次?任何帮助将不胜感激!
我创建了一个小例子来说明这个问题。
主要.cpp:
int foobar(){
Singleton::createModel();
Singleton::getModel(); //SECOND CALL TO CONSTRUCTOR
return 0;
}
单例.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;
};
工厂.h:
class Factory {
public:
Factory(){
Factory2 factory2;
}
};
工厂2.h:
class Factory2 {
public:
Factory2();
};