Сообщение от The_God:
копилятор определяет типы на этапе компиляции и генерит процедуры для каждого использованого типа свои
Тогда всё отличие от Delphi состоит только в том, что ты тратишь меньше времени на набор текста программы, я трачу больше тем, что приходится расписывать большее колличество функций, а выполняются программы всё равно одинаково.
И на тему динамического каста: в Delphi все переменные типа класса, у которых не вызывается конструктор, являются указателями. То есть в Delphi есть возможность если ты уверен, что в этой переменной лежит указатель именно на этот класс, не использовать вообще касты а работь с указателями, не задумываясь куда он указывает.
[Ответ]
The_God 21:26 20.01.2008
Сообщение от DWanek:
Тогда всё отличие от Delphi состоит только в том, что ты тратишь меньше времени на набор текста программы, я трачу больше тем, что приходится расписывать большее колличество функций, а выполняются программы всё равно одинаково.
угу
много способов использования, на примере функции просто очевидно как это может улучшить жизнь, есть и более хитрые приёмы.. но про них надо читать в книгах. эту технологию придумывали для решения реальных задач.
скорость выполнения она не изменяет, скорость разработки увеличивает, скорость компиляции уменьшает [Ответ]
The_God 21:29 20.01.2008
былоб прикольно еслиб метапрограммирование изучали в универе и политехе, хотяб в базовом виде.
ооп это ведь не предел абстракции.
[Ответ]
Pengvin 22:42 20.01.2008
The_God, взгляни на топикстартера. Ему хотя бы с ООП разобраться, а заинтересованный человек сам потом нужную информацию поднимет.
[Ответ]
DWanek 12:33 21.01.2008
Сообщение от The_God:
былоб прикольно еслиб метапрограммирование изучали в универе и политехе, хотяб в базовом виде.
ооп это ведь не предел абстракции.
Какое там метопрограммирование . Не знаю как там на ПММе, но у нас в политехе Delphi изучали на уровне кнопочек-картиночек. А ты про метапрограммирование. Если бы я сам не захотел это изучить в институте такого никогда бы не рассказали.
[Ответ]
MadFish 15:00 21.01.2008
Метапрограммирование это конечно круто, но вот за необходимость явного вызова конструкторов и диструкторов, я готов дядюшку Вирта и разработчиков Delphi придушить!!! А множественное наследование не только потенциальный источник ошибок, но и большой плюс в плане проектирования интерфейсов(1 объект много интерфейсов). Delphi-язык для обучения школьников и написания мелких поделух. (ИМХО) Да еще забыл про темплаты, хотя в Delphi о них тоже забыли..
[Ответ]
DWanek 15:10 21.01.2008
Сообщение от MadFish:
Delphi-язык для обучения школьников и написания мелких поделух.
Когда будет закончен наш проект, я дам посмотреть тебе на эту "мелкую поделуху".[Ответ]
The_God 15:38 21.01.2008
руки самый большой источник ошибок
Сообщение от MadFish:
необходимость явного вызова конструкторов и диструкторов,
Эти споры уже достали. Я вот вчера побыстрому простенькую среду для асма сваял под Fasm с подсветкой синтаксиса и выводом компилятора в отдельое окошко,за час на Delphi. Это конечно "поделуха", но для некторых задач Delphi незаменим. И вобще на нем можно при желании и драйвер написать и ядро ОС, главное линкер найти. Кстати линкер тоже можно на Delphi написать.
[Ответ]
AIM-9M 17:49 21.01.2008
Сообщение от DWanek:
Когда будет закончен наш проект, я дам посмотреть тебе на эту "мелкую поделуху".
Пока вокруг все кричат о смерти и отстойности дельфи, народ зарабатывает с помощью нее нормальные бабки. Может дело не в инструменте а в мастере?
[Ответ]
DWanek 19:14 21.01.2008
AIM-9M, не знаю я в чем тут дело, но я работаю и заработываю неплохие деньги знанием Delphi. Да и не хочу я сказать, что Delphi лучше C++, вот не хуже это точно. Меня просто убивают высказывания о том, что на Delphi нелья сделать ничего серьёзного. Если кто-то не знает как это сделать - это совсем неозначает, что это невозможно.
Сообщение от The_God:
руки самый большой источник ошибок
5 баллов Я буду это цитировать
Сообщение от The_God:
это что ? всмысле где это так страшно выглядит.
что ты забыл про темплейты ?
Это так страшно выглядит в дельфе. Представь себе табличку, ну скажем 100х100, состоящую из объектов. Так после создания таблички нужно еще пробежать по всем элементам и дернуть за конструктор... а если размерность таблицы динамическая... а если добавляем\удаляем строки \столбцы изменяем размерность? и уж не дай бог это древовидная структура!!! Одним словом? приятного мало...
про темплаты я забыл что их нет в дельфи...
PS Я не критикую дельфи как инструмент, у каждого проффессионала на столе их не один десяток. Просто раз уж речь зашло про ООП? то в дельфе это все неудобно(ИМХО). И еще я не понимаю оголтелой любви Воронежских программеров к этому языку. Ну ладно бы ностальгия по универу, а то приходят на собеседование такие кто кроме делфи НИЧЕГО не знают(и не хотят знать), да еще и учат мну жизни, что лучше знать оди язык но досконально (че там знать досконально? VCL чтоли?) чем знать несколько но не так глубоко...
[Ответ]
Pengvin 17:38 23.01.2008
MadFish проблема не в языке, в а его так сказать носителях. Арабский язык ведь в людей не стреляет.
И еще можно объяснить насчет "дернуть за конструктор". Я человек темный все по старинке делаю. Можно объяснить, как мне не бегать по дереву и не "дергать конструктор". Вот на примере двоичного дерева:
ptree root;
int _tmain(int argc, _TCHAR* argv[])
{
int length = 15;
int* mas;
mas = new int[length];
for (i = 0 ; i < length; i ++ )
mas[i]=rand();
mas[0] = 10;
Сообщение от Pengvin:
Я человек темный все по старинке делаю. Можно объяснить, как мне не бегать по дереву и не "дергать конструктор". Вот на примере двоичного дерева:
Я тоже не шибко грамотный, и по этому тоже все делаю по старинке... Если отбросить Ваши игрища с темплатами и не переутомляться с рекурсией, а сделать все глупее и тривиальнее, то получим следующее:
class CA
{
____int a;
};
class CB
{
____CA a;
};
int _tmain(int argc, _TCHAR* argv[])
{
____CB b;//необходимо и достаточно
____return 0;
}
А вот в дельфи пришлось бы во первых работать только по ссылке, во вторых в опрераторе new(или сразу после ) вызывать конструктор b и внимание!!! вручную создать b.a и вызвать конструктор (запихнуть создание b.a и вызов конструктора b.a в конструктор b нельзя!!!, т.к. на момент выполнения конструктора b объект b еще не определен ну и как вам это нравиться??? а если вложенность не 1 как сдесь, а 10-15 уровней?). Данная проблема напрямую вытекает из того факта, что в паскале нет стандартного правила именования конструкторов, и компилятор не может самостоятельно определить какой из конструкторов вызывать. А при большом количестве элементов или при большой вложенности, факт необходимости ручного вызова начинает оч сильно напрягать. Да и главное потом не забыть перед dispose вызвать диструкторы b.a и затем b, что многие забывают, и как факт мемори лики = куча ненужной писанины-неудобно...
PS Еще раз повторюсь, я не против делфи как языка, просто ООП к нему прикручено "не доконца" и как следствие неудобно. НО ЭТО ТОЛЬКО МОЕ ИМХО!!!
[Ответ]
Pengvin 21:07 23.01.2008
извиняюсь я наверное действительно плохой пример привел. засрал все рекурсией, а сути не видно. Весь акцент был сделан на то,что конструктору передается параметр. При его "автоматическом" вызове нам придется инициализировать этот параметр самостоятельно, соответственно вся экономия теряется. Например я передаю конструктору строку и потом хеш от нее беру внутри него(это пример, проще конечно сразу хеш передавать). Я не спорю - это все замечательно, я лично об этом не знал, поэтому спасибо за информацию теперь буду это использовать. Я просто книжек по С/С++ вобще не читал большую часть на примерах и MSDN осваивал и многих тонкостей не знаю.
[Ответ]
DWanek 21:20 23.01.2008
MadFish, то есть написать вместо:
CB b
вот так:
b := Cb.Create;
и в конце:
b.Free;
это проблема?
И на тему вызова деструктора: а если ты хочешь в середине процесса выполнения программы осободить память?
[Ответ]
The_God 21:28 23.01.2008
это проблема, любые парные операции влекут ошибки
в с++ есть специальные приёмы которые позволяют делать так чтобы не заботится о парности таких вызовов, с их помощью вызов "Free" делается автоматически при выходе из функции или блока в котором создался объект CB b.
надо думать над алгоритмом, а не лазить по коду исча для кокого объекта забыл вызвать деструктор или еще чегото обязательного для его уничтожения.
а если из функции точек выхода несколько.. то получается копипаст этих вызовов во все точки выхода, а при добавлении нового такого хитрого объекта опять нужно руками расставить в нужных местах его уничтожение а если в это время немного спешиш ( уже поздно и домой хочется ).. то глюки например в виде утечки памяти обеспечены.
[Ответ]
MadFish 21:31 23.01.2008
Сообщение от DWanek:
CB b
вот так:
b := Cb.Create;
и в конце:
b.Free;
это проблема?
не, проблема не в этом. проблема в том, что после
b := Cb.Create;
я еще должен написать
b^.a:=CA.Create;
итд.
Сообщение от DWanek:
И на тему вызова деструктора: а если ты хочешь в середине процесса выполнения программы осободить память?
а если нехочу???
опять, не в том вопрос. вопрос в том что я ДОЛЖЕН строго последовательно вызывать диструкторы РУКАМИ, а потом освобождать памят dispose
[Ответ]
DWanek 07:11 24.01.2008
Сообщение от MadFish:
я еще должен написать
b^.a:=CA.Create;
Не должен.
В обработчике конструктора класса b пишешь один раз:
constructor CB.Create;
begin
__a := CA.Create;
end;
соответственно в деструкторе:
destructor CB.Destroy;
__inherited;
__a.Free;
end;
Вызвав b := CB.Create, "a" создастся сам, при вызове b.free, "а" уничтожится сам.
[Ответ]
DWanek 07:15 24.01.2008
Сообщение от MadFish:
я ДОЛЖЕН строго последовательно вызывать диструкторы РУКАМИ, а потом освобождать памят dispose
Что значит освождать память dispose?
При вызове деструктора "a.Free" всё само автоматически обнуляется, уничтожается, заниливается и освобождается, и кроме этого писать ничего не надо.
[Ответ]
DWanek 13:08 24.01.2008
Pascal лучше C++ хотя бы тем, что в нем нельзя написать такое:
Жалко несчастных людей, которые читают чужой код, написанный на C++.
MadFish, в Delphi не используются старые паскалёвские операторы "New" и "Dispose". Память выделяется и освобождается автоматически при вызове конструкторов и деструкторов класса. Уже в Turbo Pascal это не использовалось [Ответ]
The_God 13:34 24.01.2008
Сообщение от DWanek:
for(;P("\n").R-;P("\ "))for(e=3DC;e-;P("_ "+(*u++/8)%2))P("| "+ (*u/4)%2);
А в C++ можно.
этот код не скомпилится не при каких комбинациях используемых типов, хотяб потомучто оператор '-' заюзан неправильно. еще нехватает оператора в одном месте. вобщем странный код какойто.....
подобные скороговорки в стиле PERL пишут либо тайные поклонники языка PERL либо начинающие с\с++ кодеры, которые хотят показать как он круто могут запихнуть все операторы в одну большую кучу, жертвуюя читабельностью кода.
когда человек работает давно, он пишит так чтобы было все просто и понятно, а такие скороговорки он может читать, но писать их не будет.
[Ответ]