Разоблачение синглтона C ++ в Python

Я пытаюсь обернуть C ++ синглтон с Boost :: Python:

class EigenSolver {
private:
static EigenSolver* _self;
static int _refCount;
protected:
EigenSolver();
~EigenSolver();

private:
EigenSolverOptions _options;
BasicTypes::Array<double> eigenValues;
BasicTypes::RegularArray <double> eigenVectors;

public:
// singleton initialization, returns unique instance
static EigenSolver* Instance() {
if (!_self) _self = new EigenSolver();
return _self;
}
// singleton memory free
void FreeInst() {
_refCount--;
if (!_refCount) {
delete this;
_self = NULL;
}
}
};

Код обертки:

py::class_<EigenSolver, boost::shared_ptr<EigenSolver>, boost::noncopyable>
("EigenSolver", py::no_init)
.def("Instance", &EigenSolver::Instance, py::return_internal_reference<>())

Когда я пытаюсь скомпилировать библиотеку, я получаю неразрешенную ошибку внешнего символа:

error LNK2001: unresolved external symbol
"private: static class UTILS::EigenSolver * UTILS::EigenSolver::_self"(?_self@EigenSolver@UTILS@@0PEAV12@EA)
PythonBindingsSolverLib.lib
What is the right way to wrap a C++ singleton class?

Как правильно обернуть одноэлементный класс C ++ с помощью boost :: python?

Заранее спасибо,
Иван.

1

Решение

Проблема была решена с помощью реализации, представленной в C ++ Singleton дизайн шаблона вопрос:

py::class_<EigenSolver, boost::shared_ptr<EigenSolver>, boost::noncopyable>
("EigenSolver", py::no_init)
.add_property("instance", py::make_function(&EigenSolver::Instance,
py::return_value_policy<py::reference_existing_object>()))
;
0

Другие решения

Других решений пока нет …