Как расширять структуру / класс вне его / ее объявления?

93
12 августа 2019, 00:10

Никак не могу понять как на примере интерпретатора python можно расширять главный PyObject дополняя его методами и другими объектами не правя саму внутренность в определении структуры?

вот пример:

static PyObject * null_error(void)
{
    if (!PyErr_Occurred())
        PyErr_SetString(PyExc_SystemError,
                        "null argument to internal routine");
    return NULL;
}

Как вообще это работает или как хотя бы называется правильно такая конструкция с звездочкой? Для плюсовых классов картина такая же?

Answer 1
struct PyObject  {
   virtual  bool PyErr_Occurred()  = 0;
   virtual PyObject* null_error() = 0;
};
struct D : PyObject {
    // добавим обьект
    int k = 5;
    virtual  bool PyErr_Occurred() final { return this;}
    virtual PyObject* null_error() override
     {
         if (!PyErr_Occurred())
             throw "null argument to internal routine";
         std::cout << '\t' << k << std::endl;
         return this;
     }
};
struct D1 : D {
    // добавим обьекты
    std::string s = "D1";
    int n = 3;
    char c = 'c';
    //добавим функционал
    void foo() { std::cout << s << "::" << c << std::endl; }
    virtual PyObject* null_error() final
     {
         foo();
         return this;
     }
};

Указатель на PyObject может содержать начало адреса обьектов любого производного класса. Мы можем добавлять классы в иерархии, можем изменять и добавлять функции, обьекты в классах, при этом не трогать базовый класс и сам код. Например:

int main()
{    
    D d; D1 d1;
    PyObject *p  = &d, *q = &d1;
    try {
       p->null_error();
       q ->null_error();
       cout << p->PyErr_Occurred() << endl << q->null_error() << endl;
    }
    catch (const char* p) {
        cerr << p;
    }
    cout << &d1 << endl;
    return 0;
}

Этот код не будет зависеть от того, что вы измените в классах и в их функциях. Вам это интересовало?...

READ ALSO
Библиотека libxl не видит файл

Библиотека libxl не видит файл

Пытаюсь проверить работоспособность примера библиотеки libxl:

107
Из цифр двух натуральных чисел создать наименьшее возможное число, сохраняя порядок следования цифр

Из цифр двух натуральных чисел создать наименьшее возможное число, сохраняя порядок следования цифр

Требуется написать программу, которая из цифр двух натуральных чисел создает наименьшее возможное число, сохраняя при этом порядок следования...

119
Стохастическая матрица (Markov chain)

Стохастическая матрица (Markov chain)

у меня произошла ошибкаМне нужно создать стохастическую матрицу, например:

119
Перехват трафика TCP

Перехват трафика TCP

От моего вопроса вытекает следующий вопрос: можно ли на андроиде перехватить TCP трафик? На устройстве нету TCPЯ не могу создать VPN и пересылать...

95