#ооп #c
Поскольку OO - это шаблон программирования, а не неотъемлемое свойство языка, он должен быть применим и к C. Как пишут ОО-код в C, когда это нужно и когда нельзя задействовать C++?
Ответы
Ответ 1
Ну, суть сказали - использовать структуры для хранения контекста конкретных объектов. И передавать соответствующую структуру аргументом в функции. Которые уже будут работать с этой структурой как с классом =3 Пример: typedef struct { // контекст объекта с чем угодно внутри int x; int y; } nya; typedef nya * pnya; void nya_construct (pnya this) // конструктор { this->x = 0; this->y = 0; } void nya_incx (pnya this) // метод 1 { this->x++; } void nya_decy (pnya this) // метод 2 { this->y--; } int main (void) // использование { pnya first = (pnya)malloc(sizeof(nya)); // объект 1 pnya second = (pnya)malloc(sizeof(nya)); // объект 2 nya_construct(first); // конструируем nya_construct(second); nya_incx(first); // исполняем метод в контексте объекта 1 free(first); // удаляем. Деструктора нет, его не вызываем free(second); } Ну, в таком духе.Ответ 2
Ну и вопросик. Как пишут - не знаю, объяснить тем более не смогу. Но могу назвать классический пример - библиотека графических виджетов Tk (из известной связки Tcl/Tk). На классику ООП весьма похоже, написано на C, исходники открыты и статей куча. Но энтузиазм с этим знакомиться должен быть свой.Ответ 3
с разной степенью гемморойности можно сделать классы члены класса - это члены структур. даже виртуальные методы можно сделать - при создании структур надо создавать в экземпляре класса указатель на область памяти например массив с указателями на функции. много ручного труда но сработает. вызывать деструктор при выходе из блока можно только вручную (автоматически - нет - автоматически - это когда сам компилятор вставляет такой код) единтвенное что не могу предположить как делать это бросать исключение (конечно какой нить глобальный джамп написать можно, но кто при этом ресурсы будет освобождать - проблема).Ответ 4
У меня был случай, когда писался ОО-код на C. Делался WDM драйвер. Для драйвера возможен только C-код. Драйвер был для звука на основе AC-Link. Поскольку есть много разных кодеков, а набор используемых методов очень близок, то была реализован упрощенный COM-подобный интерфейс. Вся реализация строилась на структурах подобного типа struct SomeType { void *pContext; void (*pFunc)(void *pContext); }; где pContext - это укатель на экземпляр структуры.Ответ 5
Как уже сказал metazet, можно частично следовать ООП, используя структуры и функции с параметром this. Однако, это будет лишь поверхностная имитация. Наследование будет трудно реализовать и выглядеть это будет страшненько.Ответ 6
В таком случае нужно обязательно посмотреть библиотеку Gtk. Написана на Си, но при этом объектно-ориентированная. Следующие три страницы помогут разобраться: 1, 2, 3.Ответ 7
Есть классы и структуры. Классы по дефолту - private, а структуры - public. Используя структуры можно писать те же классы, только кода будет на пару строчек больше... Ну и с освобождением памяти нужно будет чуть больше повозиться. Кажется нигде не наврал :)Ответ 8
Назад к истокам?! :) Читайте про "C с классами" и "Objective C".
Комментариев нет:
Отправить комментарий