Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 直接调用C++;来自cython的结构构造函数_Python_Struct_Cython - Fatal编程技术网

Python 直接调用C++;来自cython的结构构造函数

Python 直接调用C++;来自cython的结构构造函数,python,struct,cython,Python,Struct,Cython,我试图用构造函数包包一些使用结构的C++代码,而不知道如何使用.< /p> C++结构: typedef struct point_3d_t { double x; double y; double z; point_3d_t(double x, double y, double z) : x(x) , y(y) , z(z) {} } point_3d; Cython包装器: cdef ext

我试图用构造函数包包一些使用结构的C++代码,而不知道如何使用.< /p> C++结构:

typedef struct point_3d_t
{
    double x;
    double y;
    double z;

    point_3d_t(double x, double y, double z)
        : x(x)
        , y(y)
        , z(z)
        {}

} point_3d;
Cython包装器:

cdef extern from "./cppdar.hpp":
    ctypedef struct point_3d:
        point_3d(double, double, double)
        double x;
        double y;
        double z;
现在,我希望能够通过类似于
cdef point\u 3d p1(v,v,v)
(从cython文件中)的方式构造结构,但我似乎不知道如何让cython只使用提供的构造函数

我试过:

  • cdef点\u 3d p1(v,v,v)
  • cdef点3d p1=点3d(v,v,v)
  • cdef点\u 3d p1(0,0,0)
  • cdef point\u 3d p1=point\u 3d(0,0,0)
其中
v
是一个显式的
cdef双v=0
,但不起作用

使用普通的
cdef point_3d p1
p1.x=nnnn
,等等,但这很烦人,我不明白为什么我不能使用默认构造函数,我想


试图研究这个问题会产生很多与类构造函数相关的杂波,这没有什么帮助。

< P> OK,所以答案是,不能用Cython中的构造函数参数来堆叠分配C++对象,基本上是:

发件人:

是的,这是一个限制,但这是一个比 解析器。中堆栈分配对象的构造和销毁 C++与它们的范围错综复杂,范围规则是 不同于Python和C.例如,考虑

if some_condition(): 
    x = Foo(1) 
else: 
    x = Foo(2, 3) 
return x.method() 
<>这在C++中是无法表达的。相反地

if (some_other_condition()) { 
    Foo_with_RIAA foo(x) 
} 
... 
无法“正确”转换Python作用域规则

现在有一些情况下,它可能是有意义的,但意义重大 必须进行代码生成更改,就像当前所有更改一样 变量在函数顶部声明(在C89后面 标准,一些编译器强制执行)但是在C++模式下我们会 将变量的声明推迟到它的实例化 (包括避免使用任何自动插入的C级{}作用域) 为了简化代码生成)

由于总是可以在堆上分配这样复杂的对象,因此 这不是一个很大的限制

这是额外的双重加上恼人的,因为这意味着您在许多情况下无法包装缺少默认构造函数的类



可怕的,没有好的黑客解决方法是将构造函数包装在一个简单的C(++)函数中,然后通过cython公开它

我不确定我是否理解你的工作循环会给你带来什么?我想你仍然需要一个默认的构造函数。@DavidW-是的,你仍然需要一个构造、构造和移动过程,但这比作为默认值实例化要好得多,然后分别设置成员。我相信Cython可以先构造然后复制分配/移动分配:
cdef point\u 3d p
然后
p=point\u 3d(…)
。您可能需要告诉它有关默认构造函数以及您使用的构造函数的信息。@DavidW-是的,但我正在尝试删除默认构造函数,因为我希望能够避免意外地出现未初始化的实例。