169 похожих чатов

Ребят в СИ можно реализовать ООП?

33 ответов

184 просмотра

Конечно

Есть же objective c

Firuz
Есть же objective c

Есть же С++ :))

GObject

Николай- Автор вопроса

Да. GObject как вариант, но есть ещё COS.

вместо классов - структуры, вместо виртуальных функций - указатели на функции

https://github.com/CObjectSystem/COS

Andrey Sokolov
вместо классов - структуры, вместо виртуальных фун...

Вот так просто вместо вируальых функций - просто указатли на функции ? Указатели на функции просто заменят "методы" С++, а не вирутальные функции. Ну а уж что говорить про деструкторы и констуркторы.

smt model 1
https://github.com/CObjectSystem/COS

ой извините, случайно прочитал CLOS, вместо COS

Andrey Electron
Вот так просто вместо вируальых функций - просто у...

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

Andrey Sokolov
можно в структуру, которая содержит данные объекта...

Виртуалные функции в С++ - это метод полиморфизма. Вы тоже можете создать разные классы с одинаковым методом - НО это не будет виртуальная функция, так как Классы имеют разный ТИП.

Andrey Electron
Виртуалные функции в С++ - это метод полиморфизма....

я как раз про реализацию полиморфизма и говорю. Указатель нужен, чтобы менять его в потомках

Andrey Sokolov
я как раз про реализацию полиморфизма и говорю. Ук...

Я вот как раз не вижу в ваших словах - пример реализации полиморфизма.

Andrey Electron
Я вот как раз не вижу в ваших словах - пример реал...

#include <stdio.h> typedef struct Base { void (*print)(const char* s); } Base; static void BasePrint(const char* s) { printf("Base: %s\n", s); } Base constructBase() { return (Base){ .print = BasePrint }; } typedef struct A { struct Base B; } A; static void APrint(const char* s) { printf("A: %s\n", s); } A constructA() { return (A){ .B.print = APrint }; } void main() { A a = constructA(); a.B.print("ggg"); } результат $ gcc 1.c $ ./a.out A: ggg $

Andrey Electron
Я вот как раз не вижу в ваших словах - пример реал...

самый наверно яркий пример полиморфизма - это возможность в Linux читать из файла системным вызовом read независимо от того, как устроен сам файл. А ядро Linux написано на C

Andrey Sokolov
самый наверно яркий пример полиморфизма - это возм...

Причем тут read и полиморфизм. Мне кажется ты не понимаешь, что такое полиморфизм или я. Мы это выясним, если ты сделаешь то, что я попросил выше. Сделай пожалуйста то, что я попросил выше

Andrey Electron
Причем тут read и полиморфизм. Мне кажется ты не п...

#include <stdio.h> typedef struct Base { void (*print)(const char* s); } Base; static void BasePrint(const char* s) { printf("Base: %s\n", s); } Base constructBase() { return (Base){ .print = BasePrint }; } typedef struct A { struct Base B; } A; static void APrint(const char* s) { printf("A: %s\n", s); } A constructA() { return (A){ .B.print = APrint }; } void callPrintUsingPoiner(Base* b) { b->print("ggg"); } void main() { A a = constructA(); Base b = constructBase(); callPrintUsingPoiner(&a.B); callPrintUsingPoiner(&b); } результат $ ./a.out A: ggg Base: ggg $

Andrey Sokolov
#include <stdio.h> typedef struct Base { void (*...

А теперь сделай пожалуйста следующее: Base* Base_pointer; Base_pointer = (Base* )malloc[2]; А теперь дабавь в первый элемент тип struct A, а во второй элементы тип struct B и вызови одинаковые метод у этих двух стурктур. А ТОЧНЕЕ - ЭТИ ДВУХ СТРУКТУР УЖЕ НЕТ - ТАК КАК ЕСТЬ ЕДИНЫЙ БАЗОВЫЙ КЛАСС, вот после доавбления в условный единый контенейр твоих двух стурктур и вызвови методы этих стурктур, как метод БАЗВОГО КЛАССА.

Andrey Electron
А теперь сделай пожалуйста следующее: Base* Base...

#include <stdio.h> #include <stdlib.h> typedef struct Base { void (*print)(const char* s); } Base; static void BasePrint(const char* s) { printf("Base: %s\n", s); } Base constructBase() { return (Base){ .print = BasePrint }; } typedef struct A { struct Base B; } A; static void APrint(const char* s) { printf("A: %s\n", s); } A constructA() { return (A){ .B.print = APrint }; } void main() { A a = constructA(); Base b = constructBase(); Base** m = malloc(sizeof(*m) * 2); m[0] = (Base*)&a; m[1] = &b; m[0]->print("ggg"); m[1]->print("ggg"); } результат тот же A: ggg Base: ggg

Andrey Sokolov
#include <stdio.h> #include <stdlib.h> typedef str...

Не смущает, что подобный каст это уб?))

Geneva
Ага

в PostgreSQL повсеместно такое используется

Andrey Sokolov
в PostgreSQL повсеместно такое используется

Ты можешь взять адрес поля и всё будет ок, но не адрес объекта другой структуры и кастануть.

²
где

https://github.com/postgres/postgres/blob/c1c09007e219ae68d1f8428a54baf68ccc1f8683/src/backend/optimizer/plan/createplan.c#L4992 https://github.com/postgres/postgres/blob/c1c09007e219ae68d1f8428a54baf68ccc1f8683/src/backend/optimizer/plan/createplan.c#L5033

В ANSI разрешено. Даже можно не указывать возвращаемый тип вообще. Но это C99, потому что блоки переменных с кодом перемешаны.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта