0

我正在尝试使用 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();
};
4

0 回答 0