LINUX.ORG.RU

Си с классами

 , ,


0

7

Тупнячка принёс, извиняйте.

Начинаю проект (личный), выбираю на чём писать: C или C++.

Ситуация такая: с плюсами возиться не хочется, да и не знаю я их толком, учил ещё в школе, до сих пор не выучил, но и на чистой сишечке, с другой стороны, писать как-то лениво.

Хотелось бы какой-то сабсет C++ или суперсет над C. Чтобы библиотеки плюсовые можно было при необходимости заюзать, класс-другой написать, а то и во все тяжкие пуститься, обмазавшись строками. Но без хардкорного плюсового упорина от которого у одних глаза с первого взгляда вытекают, а другие в дурке после прочтения оказываются.

Насколько такой суперсет C / сабсет C++ ака «Си с классами» может быть кошерен?

Объясните почему так делать не стоит, либо даже наоборот, предложите уже существующие сабсеты плюсов, которые можно перенять.

Ответ на: комментарий от WitcherGeralt

На плюсах можно писать очень по-разному и при этом кошерно. В частности можно использовать классы только для реализации ADT и управления ресурсами, а всю управляющую логику писать процедурно, не реализовывая никаких паттернов и не дробя сущности на 100500 классов. И оно будет выглядеть очень достойно, ООП будет использоваться для расширения системы типов ну и ещё может для грубого структурирования кода.

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

Вряд-ли я что-то дельное смогу в ближайшее время сделать, хотя бы потому что нужно сначала графику хоть чуть чуть освоить, одним path tracing начала 90-х и «картонными» монстрами сыт не будешь. А ещё много пиксельарта понадобится. Это проект на пару лет.

В итоге задумка может оказаться не актуальной. Придётся космодесантникам отстреливать пони.

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

Кошерным проектом в таком стиле могла бы стать Vala с её транспиляцией в C. Но похоже она никому так не пригодилась.

Пользовтелям XMPP очень даже: Dino - Modern XMPP («Jabber») Chat Client using GTK+/Vala. Недавно даже (европейское) финансирование для добавления аудио/видео поддержки получили: Setting out for calls and conferences (11.08.2020).

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

Я больше 10 лет программирую.

купите новую клавиатуру, у вас нолик западает

с опытом в более 10 лет, таких топиков не создают

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

Там omemo постоянно отваливается, он полуюзабельный. При том, что в Gajim и Conversations всё работает.

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

а в каком бассейне лучше учиться плавать?

глубоком или по пояс?

а температура воды какая должна быть?

а бассейн лучше круглый или квадратный ?

а рыбки нужны или можно без них?

а как правильно руками махать, сначала правой а потом левой или наоборот ?

а ногами тоже надо взмахивать?

а рыбкам это мешать не будет?

а мне рыбки мешать не будут ?

а может без рыбок ?

итд facepalm

ps: о себе, моряк с 20 летнем стажем

вот это точно передает информацию о вас и вашем топике

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

о себе, моряк с 20 летнем стажем

Полагаю, что скорее дебил с сорокалетним.

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

Ладно, тема такая: Ремейк Wolfenstein 3D с Трампом в главной роли. …

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

Я кстати всецело за акцент на придумки-шутки-приколы. Пусть будет типа как South Park, где графика примитивная, а сюжет и озвучка – супер.

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

Константы нет. Ссылки возможно конечно, но иногда это единственный способ получить lvalue там где это не предусмотрено в си. Да и реализация конструктора копирования без них невозможна
и ни то ни другое не требует какого-то СЛОЖНОГО рантайма и не являются синтаксическим сахаром.
stl же достаточно громоздкий и его использование когда надо всего-то склеить пару строк в одном месте не оправдано. Если реально используется значительная часть stl - другое дело

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

Можно еще как в Дьябло сделать. Выбираешь из героев:

Трампа, ле Пен, Дутерте

В конце он втыкает себе радужный кристалл в голову.

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

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

Держиcь. Не поддавайся соблазну!

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

Трамп фанатеет от Путина

Прошу прощения, а пруфчик не подкинете? Мне тут просто необходимо протроллить фанов «этих двух» ))… Реально достали своими «дебатами»…

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

Суть в том чтобы интересно покодить и немного разобраться в графике.

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

В конце разрыв шаблона может быть. Убиваешь всех противников, а выборы всё равно проигрываешь.

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

Классы тоже не особо нужны - полиморфизм и у структур есть. Разве что когда нужно наследование и vtable

Ахаха, лол. Ты серьёзно? Хотя, чего я ожидал - здесь все эксперты такие.

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

Это неважно. Важно то, что ты руководствуешься «идиоматичностью». И да - забываешь, что на крестах и на си не идиоматичного кода не бывает, совсем.

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

И что, аналогичную реализацию невозможно в Си реализовать?

Из того, что qsort до сих пор медленнее std::sort, следует что нельзя.

У тебя каникулы чтоле?

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

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

Как всегда ты сел в лужу. Но хотя бы про struct vs class запомнил, и то радует.

anonymous
()

Как насчет Ди? Там есть режим betterc, когда все это делается на сишном рантайме и прочее, и умеет кучу ништяков (из тех что не завязаны на gc).

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

Как насчет Ди? Там есть режим betterc

все это делается на сишном рантайме

На ворованном рантайме лабают только макаки.

anonymous
()

Хотелось бы какой-то сабсет C++ или суперсет над C. Чтобы библиотеки плюсовые можно было при необходимости заюзать, класс-другой написать, а то и во все тяжкие пуститься, обмазавшись строками. Но без хардкорного плюсового упорина от которого у одних глаза с первого взгляда вытекают, а другие в дурке после прочтения оказываются.
Насколько такой суперсет C / сабсет C++ ака «Си с классами» может быть кошерен?

Я тоже думаю, что зря я так избегаю крестов. Если выкинуть из крестов весь этот кошмар в виде продвинутых классов и множественного наследования, клинописи инициализаторов, принципиально неразбираемой LR парсерами, а также клинических случаев обобщенного программирования, то язык не так уж плох.

Разрабы Unity это заметили — у них запрещено использовать Boost, и по возможности они избегают STL:

https://aras-p.info/blog/2018/12/28/Modern-C-Lamentations/

То есть, их код предсавляет тот самый Си-плюс, то есть, с одним крестом вместо двух.

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

Да никто не некрофилит :) ТС хочет не упарываться — ну вот ему сабсет плюсов «нет больше слезок». А чо там в 20-м такого появилось что ему прям нужно — это он сам потом решит.

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Спасибо за ссыль! А так, я понимаю, многие концепции из 11 остались и в 17, так что как старт сойдёт

Sahas ★★★★☆
()

Ты очень легко изобретешь Си с классами и сам. Просто попробуй. А для затравочки вот тебе пример кода на Обероне, который построен примерно в той же парадигме:

Вот тут просто дергаем процедуры в стиле C++
MODULE Figures; (* Abstract module *)

TYPE
   Figure*    = POINTER TO FigureDesc;
   Interface* = POINTER TO InterfaceDesc;

   InterfaceDesc* = RECORD
      draw*  : PROCEDURE (f : Figure);
      clear* : PROCEDURE (f : Figure);
      mark*  : PROCEDURE (f : Figure);
      move*  : PROCEDURE (f : Figure; dx, dy : INTEGER);
   END;

   FigureDesc* = RECORD
      if : Interface;
   END;

PROCEDURE Init* (f : Figure; if : Interface);
BEGIN
   f.if := if;
END Init;

PROCEDURE Draw* (f : Figure);
BEGIN
   f.if.draw(f);
END Draw;

(* Other procedures here *)

END Figures.

MODULE Rectangles;

IMPORT Figures;

TYPE
   Rectangle* = POINTER TO RectangleDesc;

   RectangleDesc* = RECORD
      (Figures.FigureDesc)
      x, y, w, h : INTEGER;
   END;

VAR
   if : Figures.Interface;

PROCEDURE New* (VAR r : Rectangle);
BEGIN
   NEW(r);
   Figures.Init(r, if);
END New;

PROCEDURE Draw* (f : Figure);
   VAR
      r : Rectangle;
BEGIN
   r := f(Rectangle); (* f AS Rectangle *)
   (* ... *)
END Draw;

(* Other procedures here *)

BEGIN (* Module initialisation *)
   NEW(if);
   if.draw  := Draw;
   if.clear := Clear;
   if.mark  := Mark;
   if.move  := Move;
END Rectangles.

А тут отправляем сообщения в стиле Smalltalk или Objective-C.

MODULE Figures; (* Abstract module *)

TYPE
   Figure*    = POINTER TO FigureDesc;

   Message*   = RECORD END;
   DrawMsg*   = RECORD (Message) END;
   ClearMsg*  = RECORD (Message) END;
   MarkMsg*   = RECORD (Message) END;
   MoveMsg*   = RECORD (Message) dx*, dy* : INTEGER END;

   Handler*   = PROCEDURE (f : Figure; VAR msg : Message);

   FigureDesc* = RECORD
      (* Abstract *)
      handle : Handler;
   END;

PROCEDURE Handle* (f : Figure; VAR msg : Message);
BEGIN
   f.handle(f, msg);
END Handle;

PROCEDURE Init* (f : Figure; handle : Handler);
BEGIN
   f.handle := handle;
END Init;

END Figures.

MODULE Rectangles;

IMPORT Figures;

TYPE
   Rectangle* = POINTER TO RectangleDesc;

   RectangleDesc* = RECORD
      (Figures.FigureDesc)
      x, y, w, h : INTEGER;
   END;

PROCEDURE Draw* (r : Rectangle);
BEGIN
  (* ... *)
END Draw;

(* Other procedures here *)

PROCEDURE Handle* (f: Figure; VAR msg: Figures.Message);
   VAR
      r : Rectangle;
BEGIN
   r := f(Rectangle);
   IF    msg IS Figures.DrawMsg THEN Draw(r)
   ELSIF msg IS Figures.MarkMsg THEN Mark(r)
   ELSIF msg IS Figures.MoveMsg THEN Move(r, msg(Figures.MoveMsg).dx, msg(Figures.MoveMsg).dy)
   ELSE  (* ignore *)
   END
END Handle;

PROCEDURE New* (VAR r : Rectangle);
BEGIN
   NEW(r);
   Figures.Init(r, Handle);
END New;

END Rectangles.

LongLiveUbuntu ★★★★★
()
Последнее исправление: LongLiveUbuntu (всего исправлений: 1)
Ответ на: комментарий от anonymous

Не следует, и накидывай сопливых бенчей.

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