API Python C ++: как получить доступ к атрибуту публичного класса? - PullRequest
0 голосов
/ 09 мая 2019

У меня есть класс 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 соответствовал общедоступному атрибуту bx-> id ?

Спасибо!

1 Ответ

1 голос
/ 09 мая 2019

Основная проблема заключается в том, что bx - это указатель, поэтому bx->id может буквально находиться в любом месте памяти относительно PyBox.Поэтому offsetof никогда не может работать и, следовательно, определение членов в PyMemberDef также никогда не может работать.

Одним из решений было бы изменение определения класса, чтобы Box являлось частью класса (и, таким образом, смещениеимеет смысл).Это может иметь или не иметь смысла в зависимости от вашего кода C ++:

typedef struct 
{
    PyObject_HEAD
    Box *bx;
} PyBox;

Лучшим решением было бы использовать PyGetSetDef вместо для определения методов получения и установки свойств для bx->id.

...