gpt4 book ai didi

c++ - Python C++ API : How to access public class attribute?

转载 作者:行者123 更新时间:2023-11-28 04:18:20 25 4
gpt4 key购买 nike

我有一个 C++ 类 Box,我想使用 python C++ api 来包装它。

类定义为:

class Box {
public:
int id;

Box(double l, double b, double h);

double getVolume(void);

void setLength( double len );

private:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};

在 C-API 中,我有以下 PyBox 声明:

typedef struct 
{
PyObject_HEAD
Box *bx;
} PyBox;

和以下成员表:

static PyMemberDef pyBox_members[] = {
{"id", T_INT, offsetof(PyBox, bx->id), 0, "Box id"},
{NULL} /* Sentinel */
};

但是,当我尝试编译模块时,出现以下错误消息:

error: cannot apply ‘offsetof’ to a non constant address
{"id", T_INT, offsetof(PyBox, bx->id), 0, "Box id"},
^~~~~~~~

如何指定正确的 offsetof 以便成员 id 对应于公共(public)属性 bx->id

谢谢!

最佳答案

基本问题是 bx 是一个指针,所以 bx->id 可以是内存中相对于 PyBox 的任何地方。因此 offsetof 永远无法工作,因此在 PyMemberDef 中定义成员也永远无法工作。

一个解决方案是更改类定义,使 Box 成为类的一部分(因此偏移量是有意义的)。根据您的 C++ 代码,这可能有意义也可能没有意义:

typedef struct 
{
PyObject_HEAD
Box *bx;
} PyBox;

更好的解决方案是使用 PyGetSetDef insteadbx->id 定义属性 getter 和 setter。

关于c++ - Python C++ API : How to access public class attribute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56062983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com