pybind11 を使用して Python で共有ライブラリをバインドしようとしています。
問題を説明する簡略版を作成しました。Python から関数foobarを呼び出します。この関数は、シングルトンを構築するファクトリを再度呼び出す静的関数を呼び出します。
コードを実行可能ファイルとして (バインダーを使用せずに) 実行すると、これは正常に機能します。問題は、ライブラリが Python を介してバインダーと共に使用される場合、Singleton が 2 回 (ei、Singleton を使用するたびに) 構築されることです。Factory2のコンストラクターで1 回、後で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();
};