Никак не могу понять как на примере интерпретатора python можно расширять главный PyObject дополняя его методами и другими объектами не правя саму внутренность в определении структуры?
вот пример:
static PyObject * null_error(void)
{
if (!PyErr_Occurred())
PyErr_SetString(PyExc_SystemError,
"null argument to internal routine");
return NULL;
}
Как вообще это работает или как хотя бы называется правильно такая конструкция с звездочкой? Для плюсовых классов картина такая же?
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;
}
Этот код не будет зависеть от того, что вы измените в классах и в их функциях. Вам это интересовало?...
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Требуется написать программу, которая из цифр двух натуральных чисел создает наименьшее возможное число, сохраняя при этом порядок следования...
у меня произошла ошибкаМне нужно создать стохастическую матрицу, например:
От моего вопроса вытекает следующий вопрос: можно ли на андроиде перехватить TCP трафик? На устройстве нету TCPЯ не могу создать VPN и пересылать...