Как получить offsetof () приватный член класса? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть класс C ++ (Scenario), завернутый в тип Python:

struct PyScenario {
    PyObject_HEAD
    Scenario scen;
};

Я хотел бы представить некоторые из закрытых членов Scenario сценариям Python - без использования явных функций получения / установки:

static PyMemberDef scenarioMembers[] {
    {
        (char *)"a",
        T_DOUBLE, offsetof(PyScenario, scen._a),
        "The a"
    },
    {
        (char *)"b",
        T_INT, offsetof(PyScenario, scen._b),
        "The b"
    },
    NULL
};

К сожалению, когда я компилирую вышеупомянутое, я получаю ошибку как: 'double Scenario::_a' is private within this context.

Я не хочу обнародовать _a и _b, поэтому я попытался объявить PyMemberDef a friend из Scenario:

class Scenario {
#ifdef PY_MAJOR_VERSION
    friend   struct PyMemberDef;
#endif
private:
    double   _a;
    int      _b;
    ....
};

К сожалению, это не помогло ... Какой правильный путь?

1 Ответ

0 голосов
/ 06 сентября 2018

Основная проблема в том, что вы делаете, заключается в том, что инициализатор (предположительно) глобальной переменной находится в глобальном контексте.Инициализатор не является ни частью класса, ни компонентом функции, поэтому он не может быть другом чего-либо.

Вы должны сделать переменную функцией- static.И функция, которая содержит переменную, может быть другом класса.

PyMemberDef *PyMemberInitializers()
{
    static PyMemberDef scenarioMembers[] {
        {
            (char *)"a",
            T_DOUBLE, offsetof(PyScenario, scen._a),
            "The a"
        },
        {
            (char *)"b",
            T_INT, offsetof(PyScenario, scen._b),
            "The b"
        },
        NULL
    };

    return scenarioMembers;
}
...