Текущий архив: 2007.02.11;
Скачать: CL | DM;
ВнизВзгляд на С++ с другой стороны. Найти похожие ветки
← →
oxffff © (2007-01-15 17:20) [0]http://steps3d.narod.ru/tutorials/c-minus-minus.html
← →
kaZaNoVa © (2007-01-15 17:31) [1]а в чем сабж? изложите тут плз, накручивать счетчик стороннему сайту не хочется, тем более на народе:)
← →
Axis_of_Evil © (2007-01-15 17:48) [2]о боги - Боресков .. шутник, Ъ.
← →
Игорь Шевченко © (2007-01-15 17:51) [3]Автор неправ. Не стоит накручивать счетчик стороннему сайту
← →
Ega23 © (2007-01-15 17:52) [4]Любую хорошую идею можно довести до маразма.
ИМХО: ничего не имею против самого языка С++. Плохо то, что апологеты преподносят издевательство над типами данных и "хардкорный код" за офигенную фичу и пользуются этим напропалую.
← →
Alkid © (2007-01-15 17:56) [5]
> Любую хорошую идею можно довести до маразма.
> ИМХО: ничего не имею против самого языка С++. Плохо то,
> что апологеты преподносят издевательство над типами данных
> и "хардкорный код" за офигенную фичу и пользуются этим напропалую.
Это не апологеты. Апологеты как раз весьма ратуют за нормальный человеческий код. Другое дело, что С++ позволяет делать некоторые вещи, которые в его контексте весьма естественны, а у программистов на других языках могут вызвать слом мозгов. Например - многочисленные техники работы с шаблогами.
← →
Ega23 © (2007-01-15 18:20) [6]Лёха, ты прекрасно понял, что я хотел сказать. Мы с тобой на эту тему уже неоднократно дискутировали.
Если есть тип данных char, то использовать его как byte - это насилие. Да, в конечном итоге они между собой равны: и там и там значение 0..0хFF. Но вот области операций над ними - совершенно разные.
← →
wicked © (2007-01-15 19:43) [7]начал читать... наткнулся на
> Со временем пришло понимание, что на С++ иначе просто нельзя
> !!! Средства, изначально заложенные в сам язык, настолько
> негибки и жестки, что реализовывать системы, требующие гибкости
> на С++ было крайне тяжело и постояннно приводило к кривым
> способам (т.е. это бага а фича :)).
и перехотел читать....
что же мешает, всё таки, такому прекрасному танцору, как г-н Боресков?
← →
wicked © (2007-01-15 19:46) [8]кстати, к фамилии Боресков у меня самые что ни на есть теплые чувства - две книжки по графике в соавторстве Шикина, Борескова и Зайцева(?) долгое время были у меня настольными... да и сейчас, если бы приперло разбирать что-то этакое, пошел бы первым делом смотреть туда
← →
oxffff © (2007-01-15 23:00) [9]Почитал статью. Согласен с автором.
Все грамотно.
← →
DrPass © (2007-01-15 23:05) [10]
> что же мешает, всё таки, такому прекрасному танцору, как
> г-н Боресков?
Из личного опыта (приходится сопровождать массу плюсового софта, написанную давно ушедшими в забвение программистами):
Жутко мешают макросы, шаблонные классы, нестрогая типизация, множественное наследование и т.д. Это не программы, это свалка синтаксических конструкций. И каждый раз ловлю себя на мысли, что на других языках афтары просто не смогли бы написать весь этот бред.
← →
oxffff © (2007-01-15 23:12) [11]
> > что же мешает, всё таки, такому прекрасному танцору, как
>
> > г-н Боресков?
Есть такой паттерн class factory, так вот его придумали для С++ поскольку нет динамического инстанцирования.
С++ - это макро ООП.
← →
Sergey Masloff (2007-01-15 23:22) [12]DrPass © (15.01.07 23:05) [10]
Ну с множественным наследием согласен. Макросы туда-сюда, просто их столько готовых стандартных свои конечно можно к минимуму свести. А вот шаблоны-то за что? очень удобная вещь и особых трудностей в сопровождении что-то не замечаю.
← →
Celades © (2007-01-15 23:35) [13]
> http://steps3d.narod.ru/tutorials/c-minus-minus.html
баян! уже даже не смешно. У автора явно запущенная стадия синдрома дауна. Уж его не вылечить.
← →
Gero © (2007-01-15 23:58) [14]Зачем полумертвого пинать?
← →
wicked © (2007-01-16 00:05) [15]> DrPass © (15.01.07 23:05) [10]
> Из личного опыта (приходится сопровождать массу плюсового
> софта, написанную давно ушедшими в забвение программистами):
>
> Жутко мешают макросы, шаблонные классы, нестрогая типизация,
> множественное наследование и т.д. Это не программы, это
> свалка синтаксических конструкций. И каждый раз ловлю себя
> на мысли, что на других языках афтары просто не смогли бы
> написать весь этот бред.
то есть язык виноват в том, что понаписывали афтары?...
следуя логике, нам нужно будет судить молоток за то, что ним голову пробили? ;)
> oxffff © (15.01.07 23:12) [11]
> Есть такой паттерн class factory, так вот его придумали
> для С++ поскольку нет динамического инстанцирования.
там еще много чего нет... и ничего, живут люди...
да и дельфи тоже МНОГО ЧЕГО нет, но если я об этом заикнусь, то налетит куча борцунов, которые мне быстро докажут, что и БЕЗ ЭТОГО жить можно...
так что это вопрос скорее философии и личных предпочтений/трудолюбия/лени
> Sergey Masloff (15.01.07 23:22) [12]
> DrPass © (15.01.07 23:05) [10]
> Ну с множественным наследием согласен. Макросы туда-сюда,
> просто их столько готовых стандартных свои конечно можно
> к минимуму свести. А вот шаблоны-то за что? очень удобная
> вещь и особых трудностей в сопровождении что-то не замечаю.
поскольку в цпп нету интерфейсов (в стиле java или delphi или COM), то множественное наследование - просто нужная вещь для именно реализации интерфейсов
хотя, в принципе, никто не мешает их и через простое агрегирование реализовать... но вот шарман уже не тот ;)
оговорюсь, что COM сервера на цпп я писал всего один раз и ничего приятного не испытал :)
а про шаблоны согласен... вопящим про их не нужность можно сказать только одно - "вы не умеете их готовить"
← →
wicked © (2007-01-16 00:07) [16]> Gero © (15.01.07 23:58) [14]
> Зачем полумертвого пинать?
это кого?... Борескова или цпп? :)
← →
Бурундук © (2007-01-16 00:07) [17]2 oxffff © (15.01.07 23:12) [11]
Не богохульствуйте, коллега.
Паттерн class factory может иногда и в Дельфях пригодиться.
2 Gero © (15.01.07 23:58) [14]
"Официальное сообщение о его смерти - четвертое по счету за последние два года - считалось достоверным в течение почти шести месяцев"...
← →
clickmaker © (2007-01-16 10:17) [18]Блин, на народе кто-нибудь вообще основы веб-дизайна знает? Ну как серпом по яйцам желтый текст на черном фоне по глазам...
← →
Zeqfreed © (2007-01-16 10:39) [19]> clickmaker © (16.01.07 10:17) [18]
Хороший дизайн на народе будет смотреться нелепо.
← →
GRAND25 © (2007-01-16 10:43) [20]Очень хорошая и правильная ветка для дельфийского форума! Идеологически выдержанная. Респект!
← →
clickmaker © (2007-01-16 10:48) [21]
> [19] Zeqfreed © (16.01.07 10:39)
> > clickmaker © (16.01.07 10:17) [18]
>
> Хороший дизайн
Хороший дизайн - это уже само по себе хорошо ;)
← →
Ega23 © (2007-01-16 10:53) [22]
> Блин, на народе кто-нибудь вообще основы веб-дизайна знает?
> Ну как серпом по яйцам желтый текст на черном фоне по глазам.
> ..
Я скопировал текст, вставил в Word, распечатал (12 страниц вроде), скрепил тремя скрепками, унёс домой и вдумчиво читал в сортире и ванной.
После прочтения возник вопрос: а действительно, можно-ли в дельфях создать объект, заранее не зная его класс?
Сейчас думаю над этим.
← →
Kerk © (2007-01-16 11:01) [23][22] Ega23 © (16.01.07 10:53)
> После прочтения возник вопрос: а действительно, можно-ли
> в дельфях создать объект, заранее не зная его класс?
Можно. У меня лаба в универе была, я там dfm-ку руками парсил и создавал все.
← →
Бурундук © (2007-01-16 11:08) [24]Ega23 © (16.01.07 10:53) [22]
Можно, если известен базовый класс с виртуальным конструктором.
← →
Kerk © (2007-01-16 11:09) [25]> [24] Бурундук © (16.01.07 11:08)
Базовый класс всегда известен :)
← →
Ega23 © (2007-01-16 11:10) [26]
> Можно, если известен базовый класс с виртуальным конструктором.
А что дальше? Ну известен базовый. Ну у конструктора virtual стоит. Переменную-то как объявить?
← →
Kerk © (2007-01-16 11:11) [27]> [26] Ega23 © (16.01.07 11:10)
class of ...
← →
vlad-mal © (2007-01-16 11:14) [28]А я бы не отказался от reflection...
← →
Ega23 © (2007-01-16 11:17) [29]
> class of ...
А, точно. Как коллекцию объявить, а в конструкторе уже анализировать. Ясно.
← →
Бурундук © (2007-01-16 11:18) [30]Ega23 © (16.01.07 11:10) [26]
так переменную этого базового класса и объяви. Далее - полиморфизм.
Можно еще объявить как TObject, только толку от этого будет мало.
Переменную неизвестного класса ты, конечно, никак объявить не сможешь :-)
← →
Kerk © (2007-01-16 11:18) [31]> [29] Ega23 © (16.01.07 11:17)
Какую коллекцию? Олегтычо?
← →
Ega23 © (2007-01-16 11:18) [32]Только, ИМХО, в данном случае виртуальность базового конструктора вовсе не обязательна.
← →
Ega23 © (2007-01-16 11:19) [33]
> Какую коллекцию? Олегтычо?
>
Нормально, это сленг у меня такой. Пример - в TCollection
← →
Бурундук © (2007-01-16 11:25) [34]2 Ega23 © (16.01.07 11:18) [32]
>Только, ИМХО, в данном случае виртуальность
>базового конструктора вовсе не обязательна.
А как без неё-то?
Как ты вызовешь конструктор неизвестного класса?
← →
vuk © (2007-01-16 11:26) [35]to Ega23 © (16.01.07 11:18) [32]:
>Только, ИМХО, в данном случае виртуальность базового конструктора
>вовсе не обязательна.
Это только тогда прокатит, если конструктор в потомках не переопределять. Никогда и ни за что.
← →
vuk © (2007-01-16 11:28) [36]to Бурундук © (16.01.07 11:25) [34]:
>Как ты вызовешь конструктор неизвестного класса?
Вызвать-то он вызовет. Вопрос в том, что он вызовет.
← →
GRAND25 © (2007-01-16 11:29) [37]Вообще, считается признаком хорошего тона делать деструктор ВСЕГДА виртуальным. Почему же конструктор низя? Я думаю, что можно и даже нужно!
← →
vlad-mal © (2007-01-16 11:29) [38]Автор прото желтый червяк:
Еще одной интересной особенностью языка являются ссылки (references). Давайте сравним два описания функции:void func1 ( A& a );
void func2 ( A a );
В чем разница между этими описаниями (кроме того, что возможно программист просто пропустил символ "&") ?
А в том, что во втором случае внутрь функции передается не то, что попросил передать программист, а лишь его копия. Т.е сначала вызывается copy-constructor, а по возвращении еще и деструктор.
Т.е. всего один символ в описании параметра может привести к очень большим затратам на создание и уничтожение вот этих временных объектов. А если это достаточно "тяжеловесный" объект или данная операция проводится в цикле, то затраты могут оказаться очень большими.
Не говоря при этом о том, что если программист надеется через переданный в функцию объект получить какой-то результат (т.е. изменение в объекте), то он надеется совершенно напрасно - будет изменена лишь копия объекта, которая сразу же после этого будет разрушена. Здорово, а ?
Такое ощущение, что он сам сдуру неправильно описал метод, в который передается не то, что нужно, потом его за это взрючили и лишили квартальной премии. И так семь раз подряд. Затем родилась статья.
← →
Ega23 © (2007-01-16 11:30) [39]Так, меня не слушать, у меня чё-то пальцы путаются. я уже virtual c reintroduce начал путать.
← →
vuk © (2007-01-16 11:34) [40]to GRAND25 © (16.01.07 11:29) [37]:
>Я думаю, что можно и даже нужно!
И потом в потомках бороться с фиксированным набором параметров. И зачем?
← →
Ega23 © (2007-01-16 11:34) [41]А что, в цпп объект действительно создаётся в момент объявления?
Я имею ввиду, что конструктор ему принудительно вызывать не надо, как в Delphi?
Но это же неудобно: а если я не хочу его создавать? Если только присвоить указатель на другой реально существующий экземпляр?
← →
GRAND25 © (2007-01-16 11:35) [42]
> И потом в потомках бороться с фиксированным набором параметров.
> И зачем?
За все надо платить!
← →
Бурундук © (2007-01-16 11:35) [43]GRAND25 © (16.01.07 11:29) [37]
>Вообще, считается признаком хорошего тона делать деструктор
>ВСЕГДА виртуальным.
Это не правила хорошего тона. Это уголовный кодекс. :-)
>Почему же конструктор низя?
>Я думаю, что можно и даже нужно!
Потому что в конструкторе есть аргументы.
И они могут отличаться для базового класса и для потомка.
Так что ВСЕГДА не получится.
← →
clickmaker © (2007-01-16 11:36) [44]
> если я не хочу его создавать? Если только присвоить указатель
> на другой реально существующий экземпляр?
TSomeClass* p1 = new TSomeClass();
TSomeClass* p2 = p1;
← →
GRAND25 © (2007-01-16 11:36) [45]
> А что, в цпп объект действительно создаётся в момент объявления?
Да, конструктор вызывается автоматом.
← →
Игорь Шевченко © (2007-01-16 11:36) [46]
> Но это же неудобно: а если я не хочу его создавать? Если
> только присвоить указатель на другой реально существующий
> экземпляр?
а матчасть слабо почитать ? Это в Delphi нельзя объявить объект, не объявив указатель на него. В C++ можно и то и то, в первом случае вызовется конструктор, во втором не вызовется и все будет, как в Delphi.
Учиться, учиться и учиться
← →
vuk © (2007-01-16 11:38) [47]to GRAND25 © (16.01.07 11:35) [42]:
>За все надо платить!
За неправильные решения? Несомненно! :))
← →
GRAND25 © (2007-01-16 11:39) [48]Интересная дискуссия. Все жду, когда же к множественному наследованию перейдете :)))
← →
clickmaker © (2007-01-16 11:39) [49]
> [45] GRAND25 © (16.01.07 11:36)
>
> > А что, в цпп объект действительно создаётся в момент объявления?
> Да, конструктор вызывается автоматом
не вводи народ в заблуждение. Это только частный случай
TSomeClass c; // здесь да, автоматом
TSomeClass* c; // а это просто указатель, как и в дельфи var c: TSomeClass;
← →
Ega23 © (2007-01-16 11:39) [50]
> а матчасть слабо почитать ?
Всё знать невозможно. Будет надобность - обязательно почитаю.
> В C++ можно и то и то,
Т.е. есть разница между экземпляром объекта и указателем на него? Ну тогда всё понятно.
← →
Kerk © (2007-01-16 11:41) [51][48] GRAND25 © (16.01.07 11:39)
> Интересная дискуссия. Все жду, когда же к множественному
> наследованию перейдете :)))
Помнится, как-то на семинаре по дотнету мелкософтовый евангелист по поводу отсутствия множественного наследования в дотнете сказал что-то такое: "Приведите мне пример, когда оно действительно нужно и мы это обсудим!" :) Я чуть не заплакал, оглядываясь на сидящих вокруг матерых сишников :)
← →
GRAND25 © (2007-01-16 11:42) [52]
> vuk © (16.01.07 11:38) [47]
Понимаешь, когда идет речь о неизвестности конкретного класса объекта в момент его создания, то уже подразумевается, что создаваться он будет неким универсальным вызовом конструктора - ысцэсцынна, с заранее известным числом и типами параметров! Согласись, для слишком разных и никак не связанных между собой классов это бессмысленно и невозможно. А раз перед программистом стоит такая задача, то от виртуальности конструктора он уже никуда не денется. Судьба такой!
← →
GRAND25 © (2007-01-16 11:43) [53]
> clickmaker © (16.01.07 11:39) [49]
Я и не ввожу народ в заблуждение. Речь шла о создании ОБЪЕКТА в момент его объявления, а не указателя на объект.
← →
Ega23 © (2007-01-16 11:43) [54]
> "Приведите мне пример, когда оно действительно нужно и мы
> это обсудим!"
Золотые слова. Лёха говорил, что ему всего один раз понадобилось МН за всю его долгую практику в С++. И то, в тот момент он писал на Delphi. И МН даже не то чтобы потребовалось, а с ним выглядело бы проще. Может быть. :)
← →
GRAND25 © (2007-01-16 11:45) [55]
> Помнится, как-то на семинаре по дотнету мелкософтовый евангелист
> по поводу отсутствия множественного наследования в дотнете
> сказал что-то такое: "Приведите мне пример, когда оно действительно
> нужно и мы это обсудим!" :) Я чуть не заплакал, оглядываясь
> на сидящих вокруг матерых сишников :)
Да с этими матерыми сишниками так и надо!
← →
Игорь Шевченко © (2007-01-16 11:46) [56]
> Приведите мне пример, когда оно действительно нужно и мы
> это обсудим
Оно не нужно никогда. Но в ряде случаев очень удобно.
← →
vuk © (2007-01-16 11:47) [57]to GRAND25 © (16.01.07 11:42) [52]:
>А раз перед программистом стоит такая задача
Когда она стоИт, то да, нужно. А вот всегда - не стОит. Если память мне ни с кем не изменяет, кто-то (не будем показывать пальцем) в [37] писал о том, что конструктор можно и нужно всегда делать виртуальным. :))
← →
Ega23 © (2007-01-16 11:47) [58]
> Но в ряде случаев очень удобно.
Действительно, приведи реальный пример, когда это будет удобно.
Просто интересно.
← →
GRAND25 © (2007-01-16 11:49) [59]
> Если память мне ни с кем не изменяет, кто-то (не будем показывать
> пальцем) в [37] писал о том, что конструктор можно и нужно
> всегда делать виртуальным. :))
Ну оговорился... Я просто когда писал, был в контексте той самой задачи, когда это необходимо.
← →
Игорь Шевченко © (2007-01-16 11:52) [60]Ega23 © (16.01.07 11:47) [58]
Когда тебе надо реализовывать методы одного и того же интерфейса в группе классов для обеспечения единого представления этой группы.
← →
vuk © (2007-01-16 11:54) [61]По поводу C/C++. Вот вы мне лучше скажите, в этих языках модульность есть? А то мне все время кажется, что её там нет.
← →
Kerk © (2007-01-16 11:54) [62]> [61] vuk © (16.01.07 11:54)
Нету
← →
Ega23 © (2007-01-16 11:54) [63]
> Когда тебе надо реализовывать методы одного и того же интерфейса
> в группе классов для обеспечения единого представления этой
> группы.
>
А группа классов, конечно же, по наследованию в разных ветках сидит, да?
← →
vuk © (2007-01-16 11:57) [64]to Kerk © (16.01.07 11:54) [62]:
Вот я тоже так почему-то думаю... Раздельная компиляция есть. А вот модульности - фиг.
← →
GRAND25 © (2007-01-16 11:57) [65]
> По поводу C/C++. Вот вы мне лучше скажите, в этих языках
> модульность есть? А то мне все время кажется, что её там
> нет.
Она там и рядом не валялась!
← →
clickmaker © (2007-01-16 12:00) [66]
> Раздельная компиляция есть. А вот модульности - фиг.
не уверен, что это такой уж недостаток
меня, например, несколько напрягают все эти initialization/finalization. Ощущение, что часть логики уползает из-под твоего контроля
← →
vlad-mal © (2007-01-16 12:00) [67]Интересно, а как люди относятся к тому, что переменные можно объявлять непосредственно перед использованием?
int main()
{
int i,j;
...
if (i == b) {
my_class ddt; // переменная ddt типа my_class
ddt.some();
}
else {
your_class ttd; // переменная ttd типа your_class
ttd.more();
}
;
}
Мне представляется это очень удобным. :)
← →
vlad-mal © (2007-01-16 12:03) [68]А что модульность?
Это хорошо или плохо?
← →
Kerk © (2007-01-16 12:04) [69]Просто в паскале единица инкапсуляции - это модуль, а в С++ - класс.
← →
Ega23 © (2007-01-16 12:04) [70]
> Мне представляется это очень удобным. :)
Это лишь вопрос синтаксиса и привычки.
Кстати, я уже давно не видел процедуры-функции, занимающей более 50 строк.
← →
Думкин © (2007-01-16 12:05) [71]> Ega23 © (16.01.07 12:04) [70]
Показать?
← →
clickmaker © (2007-01-16 12:07) [72]
> [67] vlad-mal © (16.01.07 12:00)
> Интересно, а как люди относятся к тому, что переменные можно
> объявлять непосредственно перед использованием?
ну, как вариант структурирование кода - неплохо. Т.е. код оформляется в некие законченные конструкции, где все под рукой.
Но я обычно использую такое только при уникальности локальных переменных. А если у меня счетчик цикла в нескольких местах, то мне кажется правильней его один раз наверху объявить, а не в каждом for i
← →
vlad-mal © (2007-01-16 12:07) [73]
> Думкин © (16.01.07 12:05) [71]
> > Ega23 © (16.01.07 12:04) [70] Показать?
Не надо :)
← →
GRAND25 © (2007-01-16 12:07) [74]
> Интересно, а как люди относятся к тому, что переменные можно
> объявлять непосредственно перед использованием?
Уродство. Огромный минус читабельности и прозрачности листинга.
← →
Ega23 © (2007-01-16 12:10) [75]
> Показать?
Не надо, я и сам могу показать. У меня и больше бывает. Просто ну очень редко, как правило - около 15-25 строк
← →
vuk © (2007-01-16 12:12) [76]to clickmaker © (16.01.07 12:00) [66]:
>не уверен, что это такой уж недостаток
Зачем тогда в C/C++ приходится модульность имитировать?
>Ощущение, что часть логики уползает из-под твоего контроля
Если есть такое ощущение, можно просто эти вещи не использовать.
to Kerk © (16.01.07 12:04) [69]:
>Просто в паскале единица инкапсуляции - это модуль, а в С++ - класс.
Вообще-то не класс, а пространство имен. Но модульности это не добавляет.
← →
vlad-mal © (2007-01-16 12:13) [77]
> GRAND25 © (16.01.07 12:07) [74]
> Уродство.
> Огромный минус читабельности и прозрачности листинга.
Так и знал, что кто-то скажет. :)
Тем не менее, мне понравилось. К примеру, нет нужды переменную цикла где-то далеко описывать. Оно конечно, "текст метода должен помещаться на одном экране", но всякое бывает. :)
И в то же время ничто не мешает объявлять все в стиле Delphi - в самом начале, "где-то там, вверху".
С другой стороны - ничто не мешает все сделать наоборот. Все равно тем, кто читает такой код, может не понравится.
← →
Думкин © (2007-01-16 12:13) [78]> Ega23 © (16.01.07 12:10) [75]
http://www.axforum.info/forums/showthread.php?t=7095&highlight=%D1%81%D0%B0%D0%BC%D1%8B%D0%B9+%D0%B4%D0%BB%D0%B8%D0%BD%D0%BD%D1%8B%D0%B9+%D0%BC%D0%B5%D1%82%D0%BE%D0%B4
оттуда:А вот такой документации в Аксапте чертовски мало. Именно из-за того, что разрабочики свято верили в рефакторинг.
! А еще один из постулатов рефакторинга гласит следующее:
Цитата:
Extract Method
You have a code fragment that can be grouped together.
Turn the fragment into a method whose name explains the purpose of the method
Теперь берем метод \Classes\CustVendSettle\SettleNow, оставляем слой SYS и смотрим:
1. В начале метода огромный комментарий (см. первый постулат )
2. Код метода состоит из 620-и строк (см. второй постулат)
P.S. Сергей, только не говори, что исключение подтверждает правило. Аксапта с рефакторингом явно не дружатКак раз скажу. Как раз исключение и как раз подтверждает.
Для того, чтобы это понять необходомо посмотреть историю этого метода.
Начиная с версии 2.1
В том то и дело, что со временем команда сменилась.
И теперь мало кто вообще понимает что и почему там делается...
Поэтому документация очень и очень нужна.
← →
clickmaker © (2007-01-16 12:15) [79]
> [76] vuk © (16.01.07 12:12)
> to clickmaker © (16.01.07 12:00) [66]:
> >не уверен, что это такой уж недостаток
>
> >Ощущение, что часть логики уползает из-под твоего контроля
> Если есть такое ощущение, можно просто эти вещи не использовать
а я и не использую. vcl использует
> Зачем тогда в C/C++ приходится модульность имитировать?
каким образом?
← →
vlad-mal © (2007-01-16 12:15) [80]
> Вообще-то не класс, а пространство имен. Но модульности
> это не добавляет.
А что нужно-то, от модульности такого особенного, что там есть?
Доступ к закрытым членам другого класса в переделах модуля? :)
← →
Игорь Шевченко © (2007-01-16 12:16) [81]Ega23 © (16.01.07 11:54) [63]
> А группа классов, конечно же, по наследованию в разных ветках
> сидит, да?
Чаще всего да.
Странные люди, ей-богу. Для того, чтобы сравнивать два языка, их надо хотя бы знать.
← →
GRAND25 © (2007-01-16 12:17) [82]
> Тем не менее, мне понравилось. К примеру, нет нужды переменную
> цикла где-то далеко описывать.
Это разврат!
← →
clickmaker © (2007-01-16 12:18) [83]я вот одного понять не могу.
Если ц(++) такой убогий, как могло случиться, что миллионы людей впали в массовый гипноз и работают (а часто и весьма успешно работают) на сотнях программ, написанных именно на этом убожестве?
а?
не иначе - бес попутал...
← →
vlad-mal © (2007-01-16 12:18) [84]
> GRAND25 © (16.01.07 12:17) [82]
:)
← →
Бурундук © (2007-01-16 12:21) [85]2 clickmaker © (16.01.07 12:00) [66]
>меня, например, несколько напрягают все эти initialization/finalization
В плюсах ты можешь получить ровным счётом то же самое
с помощью глобальных объектов.
Потом, честно говоря, сам я как-то никогда не ощущал, что VCLные
initialization/finalization мешают мне в понимании логики.
← →
GRAND25 © (2007-01-16 12:22) [86]Удалено модератором
← →
vlad-mal © (2007-01-16 12:22) [87]
> Странные люди, ей-богу. Для того, чтобы сравнивать два языка,
> их надо хотя бы знать.
Ну нафик. Так не интересно. Если знаешь - о чем разговаривать?
← →
vuk © (2007-01-16 12:24) [88]to clickmaker © (16.01.07 12:15) [79]:
>каким образом?
.c/.h и их аналоги в cpp. При этом в заголовочных файлах применяются меры (при помощи директив условной компиляции) для того, чтобы текст не был при компиляции включен более одного раза.
← →
Игорь Шевченко © (2007-01-16 12:27) [89]vuk © (16.01.07 12:24) [88]
Вот же странно. Программисты представляются некими дебилами без признаков головного мозга и делается все, чтобы не дай Аллах, они не мучились, забыв включить заголовочный файл и.т.д
Модульность туда же.
Церковь святого Вирта :)
← →
vlad-mal © (2007-01-16 12:30) [90]А что, большая разница, указать используемый модуль в секции uses или использовать заголовочный файл?
← →
GRAND25 © (2007-01-16 12:30) [91]Удалено модератором
Примечание: Флудить завязываем
← →
clickmaker © (2007-01-16 12:32) [92]
> [88] vuk © (16.01.07 12:24)
> to clickmaker © (16.01.07 12:15) [79]:
> >каким образом?
> .c/.h и их аналоги в cpp.
да? для меня это как раз не было никогда аналогом модульности... именно эта связка c/h.
ну пространства имен - еще куда ни шло
← →
xayam © (2007-01-16 12:37) [93]
> GRAND25 © (16.01.07 10:43) [20]
> Очень хорошая и правильная ветка для дельфийского форума!
> Идеологически выдержанная. Респект!
Переходим на паскаль!
← →
@!!ex © (2007-01-16 12:43) [94]Статься отстонойная.
Да... С++ позволяет ТАКОЙ огород городить... Жуть просто...
Однако это не мешает писать на нем эффективно и понятно.
А то что основная масса не знает его на достаточном уровне... Разве это вина языка??
Лично убедился, что код на нем может быть понятен не хуже дельфи. Зависит от того кто и что писал.
← →
TohaNik © (2007-01-16 12:48) [95]
> @!!ex © (16.01.07 12:43) [94]
> Статься отстонойная.Да... С++ позволяет ТАКОЙ огород городить.
> .. Жуть просто...
Угу, место для разврата и падения нравов:)
← →
vuk © (2007-01-16 13:03) [96]to Игорь Шевченко © (16.01.07 12:27) [89]:
>делается все, чтобы не дай Аллах, они не мучились, забыв включить
>заголовочный файл и.т.д
При наличии модульности такой проблемы нет вообще.
>Церковь святого Вирта :)
Ну... Вирт здесь, скажем так, ни при чем.
← →
Игорь Шевченко © (2007-01-16 13:18) [97]vuk © (16.01.07 13:03) [96]
Ты меня извини, но С и С++ де-факто стандарт языка разработки. Поэтому пуристические размышления остаются не более чем схоластикой.
← →
Reindeer Moss Eater © (2007-01-16 13:55) [98]> Тем не менее, мне понравилось. К примеру, нет нужды переменную
> цикла где-то далеко описывать.
Это разврат!
Да нет. Это как раз удобно - раз. И читабельность кода не снижает а повышает. особенно если процедура в один экран не влезает.
← →
vlad-mal © (2007-01-16 14:08) [99]
> Да нет. Это как раз удобно - раз. И читабельность кода не
> снижает а повышает. особенно если процедура в один экран
> не влезает.
А еще бывает, что вроде метод короткий, а в нем локальные методы, куча целая (я про Delphi). От главного begin-end до объявления переменных - глаза вылупишь. Какая уж там читабельность. Тут тоже как раз пригодилось бы.
← →
iZEN © (2007-01-16 14:44) [100]Лекарство от C++ создано более пятнадцати лет назад.
Правда немного жаль, что оно само отчасти написано на С++. :)))
← →
oxffff © (2007-01-16 15:00) [101]
> Бурундук © (16.01.07 11:08) [24]
> Ega23 © (16.01.07 10:53) [22]
> Можно, если известен базовый класс с виртуальным конструктором.
>
Для динамического инстанцирования метакласса не обязательно наличие виртуального конструктора.
См. реализацию ClassCreate.
C++
-Плавающий VTB. Реально в современной жизни, где в большинстве классов присутствуют виртуальные функции, наличие плавающего VTB ограничивает гибкость программ.
Классы в С++ представляют собой лес классов, в delphi это дерево классов.
Конечно можно в С++ определить базовый класс и пусть все классы проекта наследуют от него. Все вроде бы гладко.
Но при взаимодействии этого проекта с другими проектами, классы должны знать интерфейс базового класса, что бы как-то взаимодействовать. Например запросить интерфейс.
Но таким образом прослеживается статическая линковка. То есть
Другие проекты должны знать интефейсы всех базовые классов внешних проектов.
И ни дай бог они измениться.
Тогда придется перекомпилировать все проекты.
Можно предположить пусть все проекты наследуют от одного класса.
Но реально ли это.
В Delphi все это учтено.
А как все просто.
Offset Type Description
-76 Pointer pointer to virtual method table (or nil)
-72 Pointer pointer to interface table (or nil)
-68 Pointer pointer to Automation information table (or nil)
-64 Pointer pointer to instance initialization table (or nil)
-60 Pointer pointer to type information table (or nil)
-56 Pointer pointer to field definition table (or nil)
-52 Pointer pointer to method definition table (or nil)
-48 Pointer pointer to dynamic method table (or nil)
-44 Pointer pointer to short string containing class name
-40 Cardinal instance size in bytes
-36 Pointer pointer to a pointer to ancestor class (or nil)
-32 Pointer pointer to entry point of SafecallException method (or nil)
-28 Pointer entry point of AfterConstruction method
-24 Pointer entry point of BeforeDestruction method
-20 Pointer entry point of Dispatch method
-16 Pointer entry point of DefaultHandler method
-12 Pointer entry point of NewInstance method
-8 Pointer entry point of FreeInstance method
-4 Pointer entry point of Destroy destructor
0 Pointer entry point of first user-defined virtual method
4 Pointer entry point of second user-defined virtual method
Разве не это гибкость, какой нет и не может быть в С++.
Далее простые два метода. Но насколько они мощны и востребованы.
AfterConstruction method
BeforeDestruction method
Попробуй сделать на С++.
Будешь в каждом конструкторе дописивать в конце, и декструторе в начале.
А здесь delphi все сделает за тебя.
Разве не это гибкость.
Далее делегирование реализации классу или интерфейсу.
Разве это не облегчает жизнь.
← →
Игорь Шевченко © (2007-01-16 15:35) [102]
> Попробуй сделать на С++.
Ты не представляешь, что можно сделать на С++.
← →
oxffff © (2007-01-16 15:44) [103]
> Игорь Шевченко © (16.01.07 15:35) [102]
>
> > Попробуй сделать на С++.
>
>
> Ты не представляешь, что можно сделать на С++.
Чтобы вы много не говорили :)
Реализуйте на С++ автоматический вызов методов
AfterContruction, BeforeDestruction.
← →
Игорь Шевченко © (2007-01-16 15:48) [104]oxffff © (16.01.07 15:44) [103]
Без проблем. Наследуй все классы от одного (как в Delphi), в нем установи соответствующую логику.
← →
clickmaker © (2007-01-16 16:05) [105]
> [103] oxffff © (16.01.07 15:44)
вот ведь... любая тема про языки программизма рано или поздно выливается в меренье пиписьками )
← →
oxffff © (2007-01-16 16:10) [106]
> Без проблем. Наследуй все классы от одного (как в Delphi),
> в нем установи соответствующую логику.
Продемонстрируйте как это сделать
← →
Игорь Шевченко © (2007-01-16 16:12) [107]oxffff © (16.01.07 16:10) [106]
Посмотри, как это сделано в System.pas
← →
Бурундук © (2007-01-16 16:15) [108]oxffff © (16.01.07 15:00) [101]
>См. реализацию ClassCreate.
_ClassCreate - это внутренняя ф-я, подготавливающая объект к конструированию.
Ответственна за вызов NewInstance и за разрушение объекта
в случае возникновения эксепшна в конструкторе.
Компилятор неявно встраивает её в конструктор.
Сама она сконструировать объект не может.
Игорь Шевченко © (16.01.07 15:48) [104]
>Без проблем. Наследуй все классы от одного (как в Delphi),
>в нем установи соответствующую логику.
Трудность в том, что ни из конструктора, ни из
деструктора нельзя вызвать виртуальную функцию.
Придётся городить что-нибудь типа
template<class T>
T* Create(аргументы)
{
// Check T is BaseClass
T * t = new T(аргументы);
t->AfterCreate();
}
Или есть пути проще? Я не очень хорошо знаю плюсы...
← →
oxffff © (2007-01-16 16:35) [109]>Игорь Шевченко
>Посмотри, как это сделано в System.pas
Так вот незадача в delphi компилятор подставляет в код конструктора вначале вызов ClassCreate, в конце вызов АfterConstruction.
АfterConstruction вызается после вызова всех конструкторов!!!
"Есть там регистр такой dl". Не мне вам рассказывать про это.
Для того, чтобы сделать это в С++ можно сделать фиктивный "конструктор по умолчанию" в котором вызывать виртульную функцию, которая выполняет инициализацию, после вызывать виртуальный АfterConstruction.
Даже несмотря на такой изврат. Работать не будет. Почему?
А потому, что вызов виртульных методов в конструкторе статически линкуется минуя VTB.
Вот выдержка из MSDN
Calling Member Functions and Virtual Functions from Within Constructors
It is usually safe to call any member function from within a constructor because the object has been completely set up (virtual tables have been initialized and so on) prior to the execution of the first line of user code. However, it is potentially unsafe for a member function to call a virtual member function for an abstract base class during construction or destruction.
Constructors can call virtual functions. When virtual functions are called, the function invoked is the function defined for the constructor"s own class (or inherited from its bases). The following example shows what happens when a virtual function is called from within a constructor:
Copy Code
// specl_calling_virtual_functions.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class Base
{
public:
Base(); // Default constructor.
virtual void f(); // Virtual member function.
};
Base::Base()
{
cout << "Constructing Base sub-object\n";
f(); // Call virtual member function
} // from inside constructor.
void Base::f()
{
cout << "Called Base::f()\n";
}
class Derived : public Base
{
public:
Derived(); // Default constructor.
void f(); // Implementation of virtual
}; // function f for this class.
Derived::Derived()
{
cout << "Constructing Derived object\n";
}
void Derived::f()
{
cout << "Called Derived::f()\n";
}
int main()
{
Derived d;
}
When the preceding program is run, the declaration Derived d causes the following sequence of events:
The constructor for class Derived (Derived::Derived) is called.
Prior to entering the body of the Derived class"s constructor, the constructor for class Base (Base::Base) is called.
Base::Base calls the function f, which is a virtual function. Ordinarily, Derived::f would be called because the object d is of type Derived. Because the Base::Base function is a constructor, the object is not yet of the Derived type, and Base::f is called.
Игорь Шевченко ждем от вас вашу реализацию.
← →
oxffff © (2007-01-16 16:51) [110]
> clickmaker © (16.01.07 16:05) [105]
>
> > [103] oxffff © (16.01.07 15:44)
>
> вот ведь... любая тема про языки программизма рано или поздно
> выливается в меренье пиписьками )
Как ни жаль.
Здесь вы безусловно правы.
Если и обращать внимание на языки, то наверно не на C++,C#.
Возможно стоит обратить внимание на языки D,smalltalk
← →
Игорь Шевченко © (2007-01-16 16:51) [111]oxffff © (16.01.07 16:35) [109]
Я же говорю, наследуйся от базового класса, конструируй его через helper, в helper"е вызывай виртуальный метод AfterConstruction. В Delphi разработчики комилятора это за тебя уже сделали - ну и что ?
← →
wicked © (2007-01-16 17:00) [112]процитирую сам себя:
> > oxffff © (15.01.07 23:12) [11]
>
> > Есть такой паттерн class factory, так вот его придумали
> > для С++ поскольку нет динамического инстанцирования.
>
> там еще много чего нет... и ничего, живут люди...
> да и дельфи тоже МНОГО ЧЕГО нет, но если я об этом заикнусь,
> то налетит куча борцунов, которые мне быстро докажут, что
> и БЕЗ ЭТОГО жить можно...
> так что это вопрос скорее философии и личных предпочтений/трудолюбия/лени
если человек и через 100 постингов долбится туда же, то кто ему доктор?... :-/
← →
oxffff © (2007-01-16 17:00) [113]
> В Delphi разработчики комилятора это за тебя уже сделали
> - ну и что ?
А то, что придется постоянно вызывать AfterConstruction в каждом классе.
Плюс придется ввести параметр, аналог использования регистра dl.
Только вот незадача конструктор по умолчанию не принимает параметров (ну или с параметрами но только по умолчанию). Что делать придется ввести в класс поле(аналог регистра Dl). Во как.
Это удобно?
← →
clickmaker © (2007-01-16 17:04) [114]
> Если и обращать внимание на языки, то наверно не на C++,C#.
ну шарп - это отдельная история. Его рассматривать в отрыве от дотнета вообще бессмысленно
← →
Vga © (2007-01-16 17:06) [115]> [37] GRAND25 © (16.01.07 11:29)
Вообще-то, это требование. Он должен не только быть виртуальным, но и перекрывать унаследованный.
> [24] Бурундук © (16.01.07 11:08)
Э, кстати. Конструктор - метод класса, он по определению статический AFAIK. Сама Delphi отыскивает нужный класс и его конструктор по RTTI AFAIK.
> [90] vlad-mal © (16.01.07 12:30)
Разница есть. Иногда довольно заметная.
← →
Игорь Шевченко © (2007-01-16 17:06) [116]oxffff © (16.01.07 17:00) [113]
Если через helper создавать экземпляры классов, то каждый раз вызывать не придется (все в точности как в Delphi).
Насчет удобно/неудобно - скажи это миллионам мух, программирующим на С/C++
Я повторю еще раз - С/C++ являются де-факто стандартом языка разработки.
← →
Бурундук © (2007-01-16 17:12) [117]2 Vga © (16.01.07 17:06) [115]
>Конструктор - метод класса, он по определению статический AFAIK
Во-первых, конструктор - не метод класса, хотя
синтаксис вызова и похож. Конструктор - это конструктор.
Во-вторых, метод класса тоже может быть виртуальным.
← →
Kirr. (2007-01-16 18:06) [118]
> oxffff © (16.01.07 17:00) [113]
>
>
> > В Delphi разработчики комилятора это за тебя уже сделали
> > - ну и что ?
>
>
> А то, что придется постоянно вызывать AfterConstruction
> в каждом классе.
По-моему мнению, AfterConstruction вообще не нужен. Конструктора достадочно. Вызвать конструктор предка (а в С++ это вообще удобно делать ибо есть список инициализации) нет никакого напряга совершенно.
> Будешь в каждом конструкторе дописивать в конце, и декструторе
> в начале.
А тут прямо написанно, что это такие мучения постоянно дописывать! Кошмар! А чего стоит постоянно писать: constructor и destructor? А procedure и function ? Вообще! И ниче никто не жалуется. А тут, понимаешь, дополнительный вызов написать проблема.
Меня больше напрягает отсутвие автоматических объектов в Delphi. Даже какой-нибудь маленький объект с парой полей приходиться создавать динамически. И ниче, пишу и сильно не напрягаюсь.
А уж чего в Java есть или нет... Это вообще отдельный разговор. И опять же, пишу используя то, что есть - напрягаться не надо.
← →
tesseract © (2007-01-16 18:08) [119]
> Э, кстати. Конструктор - метод класса, он по определению
> статический AFAIK. Сама Delphi отыскивает нужный класс и
> его конструктор по RTTI AFAIK.
> Во-вторых, метод класса тоже может быть виртуальным.
Конструктор может быть и виртуальным.
← →
Anatoly Podgoretsky © (2007-01-16 23:22) [120]> Zeqfreed (16.01.2007 10:39:19) [19]
> Хороший дизайн на народе будет смотреться нелепо.
Хороший дизайн на народе - это антинародно
← →
Vga © (2007-01-19 16:54) [121]> [115] Vga © (16.01.07 17:06)
> > [24] Бурундук © (16.01.07 11:08)
>
> Э, кстати. Конструктор - метод класса, он по определению
> статический AFAIK. Сама Delphi отыскивает нужный класс и
> его конструктор по RTTI AFAIK.
Значит говорите глупость сморозил... Возможно... Надо почитать...
← →
Alkid © (2007-01-19 18:43) [122]
> Лёха, ты прекрасно понял, что я хотел сказать. Мы с тобой
> на эту тему уже неоднократно дискутировали.
> Если есть тип данных char, то использовать его как byte
> - это насилие. Да, в конечном итоге они между собой равны:
> и там и там значение 0..0хFF. Но вот области операций над
> ними - совершенно разные.
Это в Паскале они совершенно разные. Дело в том, что в C/C++ char - это целочисленный тип. Использование его для хранения и оперирования числами в С/С++ весьма оправданно, а в Паскале/Делфьи - изврат.
← →
bobby (2007-01-19 21:58) [123]Когда вы будете сидеть за компами, на которых будет установлена ось написанная на Паскале, и постить из браузера, написанного на Паскале, тогда и потешьтесь. Всяк сверчек знай свой шесток.
А межплатформенность?
Детский сад.....
Страницы: 1 2 3 4 вся ветка
Текущий архив: 2007.02.11;
Скачать: CL | DM;
Память: 0.82 MB
Время: 0.042 c