Что можно сделать на языке С, если мы хотим использовать объектно-ориентированную технологию? По существу, нам нужна какая-то альтернатива виртуальным функциям. Большинству людей в голову в первую очередь приходит мысль использовать структуру с “полем типа” (“type field”), описывающим, какой вид фигуры представляет данный объект.
Также вам может показаться, что такая тема как http://www.psb-karat.ru/page-27.html никак не связана и даже не тематична с программированием. Хотя, может быть и связана.
В любом случае все-таки зайдите на сайт psb-karat.ru
Тема проекты домов там представлена весьма широко.
Рассмотрим пример.
struct Shape1 {
enum Kind { circle, rectangle } kind;
/* */
}; ’ ’ ’
void draw(struct Shape1* p)
{
switch (p->kind) { case circle:
/* рисуем окружность */ break; case rectangle:
/* рисуем прямоугольник */ break;
}
}
int f(struct Shape1* pp)
{
draw(pp);
/* */
} ’ ’ ’
Этот прием срабатывает. Однако есть две загвоздки.
• Для каждой псевдовиртуальной функции (такой как функция draw()) мы должны написать новую инструкцию switch.
• Каждый раз, когда мы добавляем новую фигуру, мы должны модифицировать каждую псевдовиртуальную функцию (такую как функция draw()), добавляя новый раздел case в инструкцию switch.
Вторая проблема носит довольно неприятный характер, поскольку мы не можем включить псевдовиртуальные функции ни в какие библиотеки, так как наши пользователи должны будут довольно часто модифицировать эти функции. Наиболее эффективной альтернативой является использование указателей на функции.
typedef void (*Pfct0)(struct Shape2*); typedef void (*Pfct1int)(struct Shape2*,int);
struct Shape2 {
PfctO draw;
Pfctlint rotate;
/* */
}; ’ ’ ’
void draw(struct Shape2* p)
{
(p->draw)(p);
}
void rotate(struct Shape2* p, int d)
{
(p->rotate)(p,d);
}
Структуру Shape2 можно использовать точно так же, как структуру Shapel. int f(struct Shape2* pp)
{
draw(pp);
/* */
} ’ ’ ’
Проделав небольшую дополнительную работу, мы можем добиться, чтобы объекту было не обязательно хранить указатель на каждую псевдовиртуальную функцию.
Вместо этого можем хранить указатель на массив указателей на функции (это очень похоже на то, как реализованы виртуальные функции в языке С++). Основная проблема при использовании таких схем в реальных программах заключается в том, чтобы правильно инициализировать все эти указатели на функции.
Опубликовал katy
April 28 2015 21:08:24 ·
0 Комментариев ·
3000 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.