Есть ли операторы new, new[], delete, delete[] - C (СИ)
Формулировка задачи:
Есть ли операторы new, new[], delete, delete[] в Си? И, если есть, чем они отличаются?
Тихо подозреваю, что их не было, ведь new пораждает исключения, но всё же.
Решение задачи: «Есть ли операторы new, new[], delete, delete[]»
textual
Листинг программы
// конструкторы-деструкторы
object_t* create_object(void);
void init_object(object*);
void destroy_object(object_t*);
// методы
void do_something(object_t *this);
// виртуальные функции
typedef struct object_ {
struct {
void (*print)(struct object_ *this, FILE *stream);
} methods;
} object_t;
object_t foo;
foo->methods->print(foo, stdout);
// (в С11 наконец сделали анонимные структуры и можно methods не писать)
// инкапсуляция держится на честном слове, как в Питоне
// мы все тут взрослые и знаем, куда лазить не надо
// наследование как наследование внутреннего состояния
// overrated, но при необходимости можно и его наворотить
struct base {
struct { /* ... */ } methods;
int a, b, c;
};
struct derived {
struct base parent;
int d;
};
struct derived *d = ...;
struct base *b = (struct base*)d; // и добраться до полей base можно
Объяснение кода листинга программы
В представленном коде:
- 1 Объявлены функции
create_object,init_objectиdestroy_object. Эти функции занимаются созданием, инициализацией и уничтожением объектов типаobject_t. Предполагается, что объект нужно уничтожать, когда он больше не нужен, и инициализировать перед использованием. - 2 Объявлена функция
do_something. Она выполняет некоторое действие с объектом. - 3 Объявлен тип
object_t. Это структура, которая содержит указатель на функциюprintи, возможно, другие данные. - 4 Объявлен объект
fooтипаobject_t. - 5 Вызывается функция
foo->methods->print(foo, stdout);. Это вызывает функциюprintдля объектаfoo, записывая результат в стандартный вывод. - 6 Объявлены структуры
baseиderived. Структураbaseсодержит поляa,bиc, а также указатель на функциюprint. Структураderivedнаследует поля и функции структурыbase. - 7 Объявлен указатель
dна объект типаderived. - 8 Выполняется операция приведения типа
dкbase*с целью получить доступ к полям и функциям структурыbaseчерез указательd. Аналогично, можно добраться до полейbaseчерез указательb.