У меня есть ScriptFactory System, в которой у меня есть объект, который создает экземпляры пользовательских объектов, созданных в Python, которые получены из абстрактного базового класса в C ++. Объекты создаются правильно, но когда я пытаюсь использовать функцию переопределения Python, он вызывает базовую виртуальную функцию C ++.
У меня есть ScriptFactory System, в которой у меня есть объект, который создает экземпляры пользовательских объектов, созданных в Python, которые получены из абстрактного базового класса в C ++. Объекты создаются правильно, но когда я пытаюсь использовать функцию переопределения Python, он вызывает базовую виртуальную функцию C ++.[code]#include #include #include #include #include
// Abstract class to be implemented in Python (the problematic one) struct Script { virtual ~Script() = default; virtual void init() = 0; };
// Class that generates scripts, (abstract, should be implemented in Python) struct ScriptFactory { virtual ~ScriptFactory() = default; virtual std::shared_ptr getScript(const std::string& type) = 0; };
// In this example, the class that generates the script using the ScriptFactory and attempts to use the generated script class Container { private: std::shared_ptr script; std::shared_ptr factory; public: Container(std::shared_ptr fact) : factory(fact) {}; void doSth(const std::string& name) { script = factory->getScript(name); script->init(); // Calls Script::init (pure virtual) instead of Pythons implementation } };
py::class_(m, "Container") .def(py::init()) .def("doSth", &Container::doSth); } < /code> И здесь код Python, который использует его: < /p> import MyTest as t
class MyFactory(t.ScriptFactory): def __init__(self): super().__init__() self.scripts:dict = {}
class MyScript(t.Script): def __init__(self): super().__init__()
def init(self): print("Hello, world!")
# Creates the factory and registers the script my_factory = MyFactory() my_factory.registerScript("MyScript", lambda: MyScript())
# Creates the container and calls its function my_cont = t.Container(my_factory) my_cont.doSth("MyScript")
# Expected: 'Hello, world!' # Real result: 'RuntimeError: Tried to call pure virtual function "Script::init"' [/code] Из всех тестов, которые я делал, похоже, что сторона C ++ теряет ссылку на переопределение Python, но я не совсем уверен.
У меня есть ScriptFactory System, в которой у меня есть объект, который создает экземпляры пользовательских объектов, созданных в Python, которые получены из абстрактного базового класса в C ++. Объекты создаются правильно, но когда я пытаюсь...
У меня есть ScriptFactory System, в которой у меня есть объект, который создает экземпляры пользовательских объектов, созданных в Python, которые получены из абстрактного базового класса в C ++. Объекты создаются правильно, но когда я пытаюсь...
Вот код
Это функция, которая вставляет узел после указанного местоположения. Здесь у нас есть узел temp и ptr. Узел Temp будет хранить узел, после которого необходимо вставить новый узел, а узел ptr хранит данные нового узла.
здесь после...
Вот код
Это функция, которая вставляет узел после указанного местоположения. Здесь у нас есть узел temp и ptr. Узел Temp будет хранить узел, после которого необходимо вставить новый узел, а узел ptr хранит данные нового узла.
здесь после...
У меня есть реализация:
Получение heap-use-after-free с трассировкой, указывающей на
#0 0x102b82868 in int std::__1::__cxx_atomic_fetch_sub (std::__1::__cxx_atomic_base_impl*, int, std::__1::memory_order) cxx_atomic_impl.h:464