Здравствуйте, Joker6413, Вы писали: J>Поэтому в делфе и можно абстрактные классы создавать, это костыль для имитирования поддержки ООП.
Ничего подобного. Для справки: тот самый однопроходный компилятор Delphi выдает warning, обнаруживая прямое конструирование экземпляра абстрактного класса.
А возможность создавать эти экземпляры прямо связана с такой штукой, как указатель на класс. Который есть реализация шаблона "Абстрактная фабрика". В связи с этим, у компилятора нет никакой информации о том, чей ты конструктор вызываешь.
... << RSDN@Home 1.1 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, FWP, Вы писали:
FWP>Здравствуйте, ArtDenis, Вы писали:
AD>>Мне например, платят не за размер кода, а за результат работы, который выражается в том, что доволен или недоволен AD>заказчик программным продуктом. FWP>Вот именно! Главное программный продукт. И вот тут-то получается, что на Delphi быстрее и надежнее.Несмотря на все template, smartpointer и т.д.
Каким же это боком? Откуда берётся скорость в написаннии кода? Если это база данных с парой строчек кода, то оно понятно, потыкал мышкой, и всё работает. Но тоже самое можно сделать на C++Builder. Скорость будет такая же. Если же речь идёт о реализации алгоритмов, работающих с большим набором различных данных, то C++ c его шаблонами нет равных. Кстати говоря, smartpointer избавляют от программмиста от гемора с удалением объектов и валидности указателей. Что тоже повышает скорость написания программы.
Если даже рассматривать шаблоны в контексте контейнеров и алгоритмов, то они — уже большой шаг вперёд, по сравнению с возможностями паскаля. А если добавить сюда Александреску и обобщённое программирование, то получается что C++ и Pascal — небо и земля.
Кроме того, Delphi предоставляет программисту такие вольности в приведении типов указателей, что даже программисту на C и не снились. А подобная вольность — источник повышенного количества ошибок.
Так что, FWP, твоё утверждение — скорее самовнушение, и не соответствует истине.
Здравствуйте, Serginio1, Вы писали:
S> Еще раз проверь S>std::iterator_traits<Iter>::value_type midl=*(begin+(end-begin)/2);
Нафига? Я с нетипизироваными адресами (в отличии от некоторых) не работаю.
end-begin возвращает количество элементов. потом оно делится на 2(оптимизатору виднее как делить или смещать он умный) и на результат смещается итератор начала. Полученый итератор разименовается.
Учим мат часть.
... << RSDN@Home 1.1 alpha 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
AD>Кроме того, Delphi предоставляет программисту такие вольности в приведении типов указателей, что даже программисту на C и не снились. А подобная вольность — источник повышенного количества ошибок.
А по-моему я не маленький и мне можно разрешать смотреть на память как я хочу. Это не источник ошибок, а повышение возможностей. Это лучше всяких там шаблонов, поскольку здесь я до конца представляю, что происходит при подобных действиях, а следовательно в случае ошибки я буду грешить не на "Майкрософт", а на свою прогу!
И вообще я уже говорил: юзайте VB — там вообще ничего не надо создавать да удалаять.
Здравствуйте, DOOM, Вы писали:
AD>>Кроме того, Delphi предоставляет программисту такие вольности в приведении типов указателей, что даже программисту на C и не снились. А подобная вольность — источник повышенного количества ошибок. DOO>А по-моему я не маленький и мне можно разрешать смотреть на память как я хочу. Это не источник ошибок, а повышение возможностей. Это лучше всяких там шаблонов, поскольку здесь я до конца представляю, что происходит при подобных действиях, а следовательно в случае ошибки я буду грешить не на "Майкрософт", а на свою прогу!
Влад в своих рассуждениях в чём-то прав. Но тут есть один момент: на C++ можно (и нужно) программировать, не используя небезопасных приведений типов. А в паскале такие приведения типов приходится использовать вне зависимости от желания программиста.
Здравствуйте, DOOM, Вы писали:
DOO>Приехали граждане... Оказывается в С нет понятия указатель на метод произвольного класса(аналог of object в Дельфи). Что на это скажете?
Скажем "Слава богу"!!! Понятие произвольного класса возникает из-за того, что в Delphi существует предок всх объектов.
Однако создание такого самого главного класса — элементарное нарушение ООД. Если нужно, создайте класс-"примесь" и "подмешайте"
его к тем классам, к которым нужно.
Нет, я с дельфями завязал. Сначала кажется, что удобно. VCL хороша, работа с БД, IDE... Но потом это всё вылазит боком.
Во-первых, тормоза. Как в работе с БД, так и просто в перерисовке окон.
Во-вторых, нет STL и вообще типизированных контейнеров
В-третьих, всё API и все библиотеки на C.
В-четвёртых, нет контроля над ситуацией.
Год назад с дуру решил проект делать на Delphi. Готов себя тогдашего убить за дурость. Если бы писал на C++ & WinAPI, всё было бы
уже готово!!!
Здравствуйте, DOOM, Вы писали:
DOO>Здравствуйте, centurn, Вы писали:
C>> Ты сам-то хоть представляещь себе шутер, написАнный на Делфях? Я говорю, что можно, но только можно ли всерьез воспринимать такую возможность? Кстати, я именно про шутер — какую-нить турновую стратегию довольно нормально можно сделать... А драйвера и операционки тоже на Делфях писАть будем...
DOO>Разница-то в чем???
Да разница, собственно, в том, что драйвер и операционку ты просто никак на делфях не напишешь, принципиально. Ну кроме, возможно, того извращенческого маневра, что тут про драйвера говорили...
А в шутере нужна максимальная производительность, которой в делфях и не пахнет. И дело даже не в качестве компилятора, а в том, что в С++ можно более тонко управлять тем, что тебе сделает компилятор. И на надо платить за то, что тебе не сейчас не нужно — это было и остается чуть ли не самым главным при развитии С++. И главное — не в ущерб функциональности.
Короче, шутер на делфах можно сделать, но на это уйдет намного больше времени, чем на С++, и будет этот шутер похож на слайд-шоу под аккомпанемент жутко свопящего винта.
DOO>Я на Дельфи не только "окошки с клиентами БД" писал. Я, например, писал полноценный сканер портов(ничем не хуже nmap'а) и NetBios сканнер. И утверждаю, что это намного проще чем на сях!
А ты на сях это писАл? Знаешь, я тоже на Делфях писал кой-чего, работающее с NetBios. Во-первых, я задолбался переводить структурки, используемые для общения с NetBios, с С на Pascal (кстати, С-шные структырки были в хелпе по WinAPI, поставляемом с Делфями, других я не нашел). А во-вторых в парочке мест я уже, грязно матерясь, просто сорвался на ассемблерные вставкм, т.к. не хватило терпения воротить все эти конструкции на паскале. И это при том, что тогда моим основным языком был как раз Делфи, а С я знал только "слегка"...
И еще, раз уж меня потянуло кнопки понажимать, выскажусь по поводу, так сказать, общепринятого удобства Делфи в создании GUI. Как я уже сказал, Делфи я знаю дольше С/С++. В основном, правда, еще с 3.0 работал, с 4.0 меньше, а на 5.0 вообще их забросил. Сейчас на работе я в основном делаю редакторы и всякие вспомогательные утилиты для игрушки. Ясное дело, там _очень _ много GUI. Так вот, я бы ни за какие плюшки (кроме _очень_ серьезной прибавки к зарплате) не променял VC на Делфю. Даже если не брать в расчет то, что надо стыковаться с кодом движка, который, ясное дело, на С++, да еще значительная часть кода используется в Plugin'е для 3DMax, у которого SDK... можно догадаться на каком языке. Я не буду по этому поводу приводить особых аргументов, т.к. удобство все-таки понятие чисто субъективное, но еще раз: заметь, что Делфи я знаю дольше, и к С++ приходилось привыкать (кстати, тогда я тоже малость плевался .
И еще мысль: практически не бывает "чистого" GUI, обычно за ним стоит еще нетривиальный код (иначе вообще непонятно, зачем нужен нужен язык программирования).
Здравствуйте, mihailik, Вы писали:
M>Смысл этого примера в том, что компаратор (указатель на функцию сортировки) передаётся в метод TList.Sort, который при помощи компаратора сортирует список.
А можно вопрос? Спасибо.
Что мне делать, если я хочу отсортировать встроенный массив или вообще какой-то свой контейнер? Придумал! Копировать его в этот TList, а потом забирать назад! Прекрасное решение!
Здравствуйте, DOOM, Вы писали:
DOO>Приехали граждане... Оказывается в С нет понятия указатель на метод произвольного класса(аналог of object в Дельфи). Что на это скажете?
Нафига?
Ну уж если приспичило то boost::function. А если надо вызывать несколоко функций залпом? Как на дельфях делать будешь? На С++ это boost::signal.
Запомни это не в С++ нет чегото что есть в дельфе это в дельфе нет много чего что есть в С++.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Joker6413, Вы писали: J>>Поэтому в делфе и можно абстрактные классы создавать, это костыль для имитирования поддержки ООП. S>Ничего подобного. Для справки: тот самый однопроходный компилятор Delphi выдает warning, обнаруживая прямое конструирование экземпляра абстрактного класса. S>А возможность создавать эти экземпляры прямо связана с такой штукой, как указатель на класс. Который есть реализация шаблона "Абстрактная фабрика". В связи с этим, у компилятора нет никакой информации о том, чей ты конструктор вызываешь.
1. Очень интересно что же создается при конструировании абстрактного класса. vptr то нет...
2. У указателя нет конструктора.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Serginio1, Вы писали:
S>> Еще раз проверь S>>std::iterator_traits<Iter>::value_type midl=*(begin+(end-begin)/2); WH>Нафига? Я с нетипизироваными адресами (в отличии от некоторых) не работаю. WH>end-begin возвращает количество элементов. потом оно делится на 2(оптимизатору виднее как делить или смещать он умный) и на результат смещается итератор начала. Полученый итератор разименовается. WH>Учим мат часть.
Ну не знаю насчет "некоторых", только сишный код только и пестрит нетипизированными указателями. По поводу Мат части и (оптимизатору виднее как делить или смещать он умный) так лично мне интересней ручками, а то мозги совсем засохнут. Например для size=2^n выравнивание лего решается через Adress = Adress and (cardinal( not (size-1))). Для других dec(address, Adress mod size) и через div и * size.
Пройдусь немного по нахваленным шаблонам. Согласен применение их очень удобно и надеюсь они появятся как в Delphi так и Net особенно для уже разработааных больших классов-шаблонов. Но хочу добавить одну Весчь что Copy-Paste-Replace лет 20 решали проблему шаблонов, но кроме всего прочего получался исходный код, который легко оптимизировался под конкретный тип.
А для С# учту (почему то только + и — n отложились, что адресс увеличивается на размер типа * n как и в Delphi при inc dec для типизированных указателей. Спасибо.
и солнце б утром не вставало, когда бы не было меня
C> Что мне делать, если я хочу отсортировать встроенный массив или вообще какой-то свой контейнер? Придумал! Копировать его в этот TList, а потом забирать назад! Прекрасное решение!
Встроенных типов не так много, легче простого написать небольшую библиотечку с функциями типа SortIntegerArray и т.п.
Или крутизна шаблонов как раз и заключается в работе со встроенными типами? Игрушечки какие-то
Вот тебе тоже вопрос на тему как применить микроскоп для забивания гвоздей. Как в C++ отсортировать виндовый SafeArray, причём в режиме thread-safe?
Здравствуйте, Serginio1, Вы писали:
S> Ну не знаю насчет "некоторых", только сишный код только и пестрит нетипизированными указателями.
А С и использование кривыми руками С++ тут причем? При правильной работе в С++ нетипизированая память используется только при работе с оочень низкоуровневым API S>По поводу Мат части и (оптимизатору виднее как делить или смещать он умный) так лично мне интересней ручками, а то мозги совсем засохнут. Например для size=2^n выравнивание лего решается через Adress = Adress and (cardinal( not (size-1))). Для других dec(address, Adress mod size) и через div и * size.
Мне архитектурных заморочек хватает выши крыши.
S> Пройдусь немного по нахваленным шаблонам. Согласен применение их очень удобно и надеюсь они появятся как в Delphi так и Net особенно для уже разработааных больших классов-шаблонов. Но хочу добавить одну Весчь что Copy-Paste-Replace лет 20 решали проблему шаблонов, но кроме всего прочего получался исходный код, который легко оптимизировался под конкретный тип.
Ну и кто тебе сказал что нельзя при использовании шаблонов настроить на конкретный тип? А что касается 20 лет там чегото решал то ИМХО больше проблем чем пользы бало. Ну сам подумай написал десяток алгоритмов на 100-200 строк раскопировал каждый на десяток типов, а потом нашол маленькую ошибку и давай исправлять... пока будешь исправлять еще наделаешь....
Copy-Paste-Replace
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, mihailik, Вы писали:
C>> Что мне делать, если я хочу отсортировать встроенный массив или вообще какой-то свой контейнер? Придумал! Копировать его в этот TList, а потом забирать назад! Прекрасное решение! M>Встроенных типов не так много, легче простого написать небольшую библиотечку с функциями типа SortIntegerArray и т.п.
Да а потом SortMyCoolType1Array, SortMyCoolType2Array, SortMyCoolType3Array,...
А потом нам будет нужен бинарный поиск по отсортированому массиву, а потом удаление элементов при выполнение какого либо условия,... M>Или крутизна шаблонов как раз и заключается в работе со встроенными типами?
Не со встроеными, а со всеми. M>Игрушечки какие-то
Эти игрушеччки сокращают размер кода в разы и значительно повышают надежность. Отсутствие возможностей для реализации элементарных смартпоинтеров использование которых не требует каких либо телодвижений и накладных расходов просто убивает.
Ну не возможно в таких условиях работать. Каменный век.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Joker6413, Вы писали:
J>1. Очень интересно что же создается при конструировании абстрактного класса. vptr то нет...
Ну куда бы она делась? Другое дело, что в слоты абстрактных методов записан адрес специальной процедурки из модуля System. См. здесь
. J>2. У указателя нет конструктора.
Ну куда бы он делся? Если в классе задекларировать виртуальный конструктор, то его можно будет вызывать по указателю на класс.
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Joker6413, Вы писали:
J>>1. Очень интересно что же создается при конструировании абстрактного класса. vptr то нет... S>Ну куда бы она делась? Другое дело, что в слоты абстрактных методов записан адрес специальной процедурки из модуля System. См. здесь
То есть реализации методов нет но сконструировать можно, хоть указывает черт знает куда но можно использовать? Так в C еще проще было пишу void *ptr = 0; и опа! у меня создан объект абстрактного класса? Могу его пользовать...
J>>2. У указателя нет конструктора. S>Ну куда бы он делся? Если в классе задекларировать виртуальный конструктор, то его можно будет вызывать по указателю на класс.
Что за бред? Ты вообще понимаешь что такое конструктор? И что за указатель на класс? Ты про метакласс говоришь или все таки про объект класса?
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Serginio1, Вы писали:
S>> Пройдусь немного по нахваленным шаблонам. Согласен применение их очень удобно и надеюсь они появятся как в Delphi так и Net особенно для уже разработааных больших классов-шаблонов. Но хочу добавить одну Весчь что Copy-Paste-Replace лет 20 решали проблему шаблонов, но кроме всего прочего получался исходный код, который легко оптимизировался под конкретный тип. WH>Ну и кто тебе сказал что нельзя при использовании шаблонов настроить на конкретный тип? А что касается 20 лет там чегото решал то ИМХО больше проблем чем пользы бало. Ну сам подумай написал десяток алгоритмов на 100-200 строк раскопировал каждый на десяток типов, а потом нашол маленькую ошибку и давай исправлять... пока будешь исправлять еще наделаешь....
Но если я захотел изменить (добавить) функциональность для конкрентого типа, которая для других типов не нужна ????? Есть в шаблонах наследование ???
Объясню подробнее. Есть база 1С. На основании метаданных можно построить объекты для прямого доступа к файлам опирающихся на несколько связанных таблиц от базового объекта. Решение через формирование исходников есть http://www.1c.hippo.ru/cgi-bin/predownl.cgi?id=2019.
Как такую проблему можно решить через шаблоны????
Это не "Понты" а практический вопрос, т.к. по понятной причине не имею с ними практики. Заранее благодарен за ответ. WH>Copy-Paste-Replace
и солнце б утром не вставало, когда бы не было меня
Hello, mihailik!
You wrote on Wed, 10 Sep 2003 11:08:07 GMT:
m> Вот тебе тоже вопрос на тему как применить микроскоп для забивания m> гвоздей. Как в C++ отсортировать виндовый SafeArray, причём в режиме m> thread-safe?
Замечательный вопрос А как его вообще отсортировать, если часть объектов, что в нем лежат, могут оказаться многомерными массивами, часть — указателями на объекты (IDispatch), а остальные — типа currency
Best regards,
Sergey.
Posted via RSDN NNTP Server 1.7 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Joker6413, Вы писали:
J>Что за бред? Ты вообще понимаешь что такое конструктор? И что за указатель на класс? Ты про метакласс говоришь или все таки про объект класса?
Я тебе очень рекомендую для прочтения Object Pascal Reference из комплекта Delphi. Тогда тебе станет понятно, о чем идет речь. Нельзя слепо применять термины в трактовке одного языка к другому языку. То, что в С++ не бывает виртуальных конструкторов и нет понятия "указатель на класс", не есть универсальное свойство ООП.
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.