【发布时间】:2019-06-26 21:00:54
【问题描述】:
我正在尝试使用 Python 复制一些 C++ 代码,其中 python 调用使用 boost 定义的 C++ 函数。
我的问题出在原始 C++ 代码引用虚函数的地方。
虚函数是用 no_init 定义的,例如
class_<G4VPhysicalVolume, G4VPhysicalVolume*, boost::noncopyable>
("G4VPhysicalVolume", "physical volume class", no_init)
// ---
如果我尝试从 Python 中使用它们,我会收到无法从 python 调用它们的错误消息。
<type 'exceptions.RuntimeError'>: This class cannot be instantiated from Python
即因为 no_init 定义意味着没有构造函数。
所以我的问题是应该如何使用 Python 中的 C++ 虚函数。
但这似乎是关于用 python 覆盖虚函数。
Boost 是 1.65.1 版本,我碰巧找到了一些关于 1.55 的 boost 和虚函数的文档。我不确定它处理虚函数的方式是否发生了变化。
我正在尝试开发一个 FreeCAD 工作台,虽然 FreeCAD 正在迁移到 Python 3,但每日更新使用的 Python 版本是 Python 版本:2.7.15rc1。
不确定类的氧气文档是最新版本,但是 G4VPhysicalVolume 记录在http://www.apc.univ-paris7.fr/~franco/g4doxy/html/classG4VPhysicalVolume.html。提升定义与我的原始帖子一样。
如果不要求有人从 FreeCAD 和 Geant4 的源代码下载和构建,就不可能提供完整且可验证的示例
【问题讨论】:
-
这是一个抽象的基类,还是一个具体的类?如果是前者,想必你需要暴露一个工厂函数来创建一个具体的子类实例,并返回一个指向基类的指针。
-
Boost 1.55 于 2013 年发布,升级它并升级 Python。抱怨古老的软件似乎有点毫无意义......哦,如果你决定把这个问题留在这里,你必须提供minimal reproducible example。 “引用虚函数”可能是一种误解,并且问题是由抽象类引起的。
-
已在原帖中添加了更多信息
标签: python c++ python-2.7 boost