LINUX.ORG.RU

Наследование в С


0

0

Парадигму наследования в С можно реализовать только так:

CFLAGS += -fms-extensions
=========================

struct a {
	int a1;
};

struct b {
	struct a;
	int b1;
};

int main()
{
	struct b bb;
	bb.a1 = 12;
}

// Код компилится и работает отлично.

Других вариантов нет? Я имею ввиду, чтобы к членам родителя можно было обращаться по указателю на дочернюю структуру, без онанизма типа

child->parent->parents_field

а сразу

child->parents_field
как в коде в начале треда.

Думал использовать препроцессор, но чего-то не клеится, хотя Страуструпп что-то подобное клепал в молодости...

★★

Объясните, ну зачем в императивных языках писать такие костыли? Попытка использования кусков ООП в императивном подходе какбэ сама по себе признак херового дизайна.

Страуструп по молодости склепал С++, чтобы показать, как делать не надо.

x0r ★★★★★
()
Ответ на: комментарий от bbk123

Он лиспер, они привыкли делать всё черезж^W^Wне как люди.

anonymous
()
Ответ на: комментарий от x0r

>Попытка использования кусков ООП в императивном подходе какбэ сама по себе признак херового дизайна.

ну да, как думаешь, glib, gtk, Gnome можно сразу закапывать и переписывать с нуля?

mono ★★★★★
()
Ответ на: комментарий от mono

Отличная идея! И даже переписывать незачем.

anonymous
()

[code=c] #define MY_STRUCT_COMMON_PART \ int a; \ bool b;

struct my_parent_struct { MY_STRUCT_COMMON_PART };

struct my_child_struct { MY_STRUCT_COMMON_PART int ololo; }; [/code] Наслаждайся своими костылями, клоун. Ах, да. В gcc вроде бы поддерживаются анонимные union, а вот в стандарте - нет.

anonymous
()

тупой движок, не все как в кусабе зделать

#define MY_STRUCT_COMMON_PART \
    int a;                    \
    bool b;

struct my_parent_struct {
    MY_STRUCT_COMMON_PART
};

struct my_child_struct {
    MY_STRUCT_COMMON_PART
    int ololo;
};

Наслаждайся своими костылями, клоун. Ах, да. В gcc вроде бы поддерживаются анонимные union, а вот в стандарте - нет.

anonymous
()

Еще можешь посмотреть как сделано в Gtk.

kondor ★★★
()

Приведённый тобой кусок кода по-прежнему демонстрирует не наследование, а включение. Позорище.

fang
()
Ответ на: комментарий от mono

> ну да, как думаешь, glib, gtk, Gnome можно сразу закапывать и переписывать с нуля?

лучше закапывать

C очень плох в таких манипуляциях. Особенно в оптимизации

namezys ★★★★
()

Прочитай про GObject, там все наглядно реализовано.

MuZHiK-2 ★★★★
()
Ответ на: комментарий от namezys

ObjC фактически тот же gobject, только с добавкой в язык удобств. Так что можно просто юзать валу, кому не нравится чистый С.

ixrws ★★★
()
Ответ на: комментарий от fang

>Приведённый тобой кусок кода по-прежнему демонстрирует не наследование, а включение. Позорище.

В данном случае адрес экземпляра структуры a, который включен в структуру b, совпадает с адресом соответствующего экземпляра b (поскольку а находится в начале b). Поэтому любая функция, которая работает с указателем на a, будет работать и с указателем на b, ничего не зная о существовании b.

Так что это не просто включение, а реализация одиночного наследования.

PS. Стандарт C гарантирует, что адрес экземпляра структуры совпадает с адресом ее первого члена.

anonymous
()
Ответ на: комментарий от anonymous

Это просто ещё один показатель черезжопности этого похода. Концептуально оно выглядит как включение, тот, кто будет читать код вводится в заблуждение.

anonymous
()

Можно сразу использовать GObject. Заодно получим биндинг к разным языкам, в т.ч. лиспу.

dmitry_vk ★★★
()
Ответ на: комментарий от ixrws

да да да :) а то, что компилятор там код препроцессором перехерачивает - не учли?

namezys ★★★★
()
Ответ на: комментарий от x0r

> Попытка использования кусков ООП в императивном подходе какбэ сама по себе признак херового дизайна.

Не забудьте написать в LKM и объяснить Торвальдсу, что он не прав.

ntp
()
Ответ на: комментарий от Pi

ООП может и императивное и функциональное быть. Но почти все ОО языки империативные.

anonymous
()
Ответ на: комментарий от x0r

Java, C#, Python, Ruby - не императивные языки? Или вы только про классы строк?

anonymous
()

В Glib создали целую систему типов и конвенцию написания классов. Там просто все делает через методы, потому все стрелочки внутри скрыты. Ну и конечно есть установка свойств через имя свойства в строке

vertexua ★★★★★
()
Ответ на: комментарий от x0r

Объясните, ну зачем в императивных языках писать такие костыли? Попытка использования кусков ООП в императивном подходе какбэ сама по себе признак херового дизайна.

Страуструп по молодости склепал С++, чтобы показать, как делать не надо.

Какбэ перечитал умных книжек, да? Какбэ еще про декларативное программирование хочешь рассказать?

cathode
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.