Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Вниз

Delphi vs. C++   Найти похожие ветки 

 
Суслик ©   (2004-09-06 14:33) [80]


> Romkin ©   (06.09.04 14:29) [78]

Да прав ты, кто с тобой спорит.

я тоже на дельфи пишу и вроде никуда не собираюсь.


 
Суслик ©   (2004-09-06 14:35) [81]


> И что? А в Delphi есть то, чего нет в сях, и что с того?

Что? А не надо тогда эмоционально реагировать на такие топики - не понимает он в чем смысл этих войн, и пр.

Есть недостатки - мы их и обсуждаем. Есть достойинства - тоже можно пообсуждать.

Широта взгляда никому не вредила.


 
Суслик ©   (2004-09-06 14:45) [82]


> Если что-то, что нельзя назвать множественным наследованием,
> позволяет тожесамо, что и это самое множественное наследование

Неправда твоя, не тоже самое см. [77].


 
Акуличев Дмитрий   (2004-09-06 14:52) [83]


> Ермак ©   (06.09.04 13:57) [72]
> Зачем столько эмоций?

Это тебе показалось.


> Еще раз скажу: ЕСТЬ широкий класс
> задач, в которых перекрестно связанные объекты невозможно
> хорошо реализовать на Дельфи без тройного а то и более уровня
> косвенноых ссылок и потери наглядности.

Я не верю заклинаниям. Если такой класс задач есть (да ещё и такими большими буквами), тебе не составит большого труда более-менее формально этот класс здесь описать. Или, на худой конец, привести пример.
А мы уж как-нибудь сами разберёмся: действительно ли это такой хитрый класс задач, или всего лишь воплощение в жизнь идеологии "Фигли думать! Трясти надо" (ц) Неизвестный Прапорщик.


> Как я буду писать
> - в виде ли одного большого исходного текста - или каждый
> намеспасе в отдельном файле - это уже мое дело, а дело среды
> - предоставить мне как можно больше вариантов.

Ты за деревьями леса не увидел.
Как раз Ц-среды предоставляют исключительно одну единственную возможсть: строить программу как один большой исходник, маскируя это различными костылями.


 
Ермак ©   (2004-09-06 15:02) [84]

В Дельфи что объект, что интерфейс всегда создается динамически. Это значит, что при работе с ним всегда есть лишний уровень косвенности - обращение через указатель. В С++ статический объект вообще не замедляет работу.

Важно ли это? В большинстве задач - нет. Но для меня было очень важно, когда я писал виртуальную машину для языка программирования (курсовик). Там типы сами являлись переменными, пространства имен - тоже переменными, которые могли создаваться динамически в процессе работы программы, наконец - сама программа - тоже переменная определенного типа, с которой можно работать как с данными. Этакий структурированный Lisp. Так там каждый из классов являлся наследником одновременно двух или нескольких классов, имел множество перекрестных связей. И то, что каждая из этих связей при компиляции превращалась в одну аасемблерную инструкцию, а не в два-три прыжка по цепочке указателей, как в Дельфи, было очень важно.

Если в дйествительности объект является одновременно и тем, и другим (и суп, и мухи одновременно;-), то должна быть возможность явно это указать, а не имитировать через делегирование или интерфейсы.


 
Ермак ©   (2004-09-06 15:09) [85]

to Акуличев Дмитрий:

Попробуй напиши на Дельфи что-либо по типу STL, чтобы любой мог иполучить универсальные контейнеры для любого типа данных, безопасные в плане исключений, и не замедляющие работы по сравнению с необъектным программированием. Когда весь дельфяцкий мир подсядет на твои классы, вместо того чтобы каждый раз писать свой ассоциативный массив, тогда я поверю, что ты можешь жить без "костылей".
Как можно называть костылями возможности языка, которые изначально были заложены в него Страуструпом, вместо того, чтобы использовать не-костыли? Если бы жесткая модульность была такой же гибкой, как пространства имен, почему при созданиии и стандартизации С++ были выбраны "костыли"? С++ - это не надстройка над С, это отдельный язык, и никто не обязывал Страуструпа сохранять совместимость с С. Кстати, в некоторых мометах он ее и не сохранил.


 
Суслик ©   (2004-09-06 15:11) [86]


> Ермак ©   (06.09.04 15:09) [85]

не кипятись.
это же холи вор.
тут нет места доводам :)))


 
SPeller ©   (2004-09-06 15:13) [87]

Поздновато, но скажу про создание объектов в стеке. Игорь Шевченко упомянул object. Да, они это позволяют, но с одним ограничением — память под сам объект освободится, но ни один деструктор при этом не вызовется. Object - это по сути record но с методами. А то что only for backward compatibility — Delphi 7 поддерживает не хуже остальных версий. Про 8-ю ничего не скажу - не пробовал.


 
Ермак ©   (2004-09-06 15:14) [88]

:-) Твоя правда! Я не кипячусь. У меня сравнение с костылями вызвало приступ дикого ржача.


 
Акуличев Дмитрий   (2004-09-06 15:15) [89]


> Суслик ©   (06.09.04 14:28) [77]
> Про имитацию множественного наследования интерфесами.


Интерфейсы -- это не имитация множественного наследования. Это самостоятельная, весьма прозрачная и плодотворная идея.


 
Суслик ©   (2004-09-06 15:16) [90]


> Ермак ©   (06.09.04 15:14) [88]

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


 
Суслик ©   (2004-09-06 15:19) [91]


> Акуличев Дмитрий   (06.09.04 15:15) [89]


> Интерфейсы -- это не имитация множественного наследования

Это не я сказал - это слова Romkin :)))


>Это самостоятельная, весьма прозрачная и плодотворная идея.


Особенно эта идея была бы хороша, если борланд дал бы возможность управлять вызовом/НЕвызовом _addref и _release. Ясно дело, что эти методы можно лишить функиональности (т.е. подсчета ссылок), но это не то.


 
Игорь Шевченко ©   (2004-09-06 15:24) [92]


> Особенно эта идея была бы хороша, если борланд дал бы возможность
> управлять вызовом/НЕвызовом _addref и _release. Ясно дело,
> что эти методы можно лишить функиональности (т.е. подсчета
> ссылок), но это не то.


Чего именно тебе не хватает, что "не то" ?

Желательно с наглядным примером.


 
Serrrrg   (2004-09-06 15:24) [93]

"Немного" критики C/C++

http://burks.brighton.ac.uk/burks/pcinfo/progdocs/cppcrit/


 
Акуличев Дмитрий   (2004-09-06 15:25) [94]


> Ермак ©   (06.09.04 15:09) [85]

При чём тут STL? Ясное дело, что без шаблонов ничего подобного не напишешь. Я против шаблонов, кстати, ничего и не говорил.
Кстати, покажешь мне место в STL, где бы модульность стала помехой?


 
Суслик ©   (2004-09-06 15:29) [95]


> Игорь Шевченко ©   (06.09.04 15:24) [92]


> Чего именно тебе не хватает, что "не то" ?

Конкретный?

Иногда надо, иногда не надо вызывать _release?

Такое часто возникает при подмесе модели интерфесов с моделью объектов. Почти все авторы, кто упоминает интерфейсы в дельфи не рекоммендуют так делать. Но все же приходится. Особенно, когда интерфейсы начинают использовать в начале проекта, а потом. Думаю за пример сойдет.

Убить вызов релиза просто:

 i: ISome;

 i := nil; // не так писать, а
 pointer(i) := nil; // вот так.


Но это же разврат :(((


 
Суслик ©   (2004-09-06 15:30) [96]


> Суслик ©   (06.09.04 15:29) [95]


> Особенно, когда интерфейсы начинают использовать в начале
> проекта, а потом.

заменить на
Особенно, когда интерфейсы начинают использовать НЕ в начале проекта, а потом.


 
Romkin ©   (2004-09-06 15:33) [97]

Суслик ©  (06.09.04 15:29) [95] Ничуть не разврат :)) А не проще дополнительно сделать вызов addref? ;)


 
Суслик ©   (2004-09-06 15:35) [98]


> Romkin ©   (06.09.04 15:33) [97]

конечно можно.
Но я бы больше был рад отмене на уровне компиляции соответсвующих вызовов (например директивами). ПО моему мнению, сложившемуся на основе анализа cpu, это было бы сделать несложно.


 
Ермак ©   (2004-09-06 15:41) [99]

2Акуличев Дмитрий: Ладно, убедил. Коли на шаблоны наездов нет, то и я на модули наезжать не буду. Но вот множественное наследование, ограничения при нем, перегрузка операторов - это извините.

Вообще-то действительно на С++ иногда пожалеешь, что нельзя собрать жесткий модуль вместо размазанных по .h и .cpp пространств имен. Однако иногда удобнее знать наверняка, в каком порядке получит твои файлы компилятор и линковщик. Да и без макроподстановок в Дельфи как без рук.


 
VMcL ©   (2004-09-06 15:42) [100]

>>Суслик ©  (06.09.04 15:35) [98]

Поздно ты. Надо было раньше, пока где-то так Delphi 5 не вышел, написать письмо в Borland с предложением и обоснованием. Могли бы и внять ;)


 
Акуличев Дмитрий   (2004-09-06 15:45) [101]


> Суслик ©   (06.09.04 15:19) [91]
> Особенно эта идея была бы хороша, если борланд дал бы возможность
> управлять вызовом/НЕвызовом _addref и _release. Ясно дело,
> что эти методы можно лишить функиональности (т.е. подсчета
> ссылок), но это не то.

Опять у тебя всё наизнанку вывернуто!
Необходимость явного вызова _addref и _release -- не какая-то крутая фича, а следствие отсутсвия в языке прямой поддержки интерфейсов.


 
Romkin ©   (2004-09-06 15:48) [102]

Суслик ©  (06.09.04 15:35) [98] Тебе подсчет ссылок совсем отключитиь надо? Так не наследуйся от TInterfacedObject :)
Обрати внимание на TVCLCOMObject...
И, наконец, что мешает прямо где нать объявить свои
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
А? Они подцепятся ;)


 
Суслик ©   (2004-09-06 15:48) [103]


> Акуличев Дмитрий   (06.09.04 15:45) [101]

что такое прямая поддержка интерфейсов наверное только таким знатокам как ты известо,

а что это именно фича, а какое-то следствие, тут заливать не надо: возьми cpu, посмотри где и как это вызывается, можно было бы и не вызывать, вот и все.


 
Суслик ©   (2004-09-06 15:49) [104]


> Romkin ©   (06.09.04 15:48) [102]

как же тут все невнимательно читают посты других :)))


 
Суслик ©   (2004-09-06 15:52) [105]


> Romkin ©   (06.09.04 15:48) [102]

я понимаю, что ты com  и прочее знаешь :))
но как мне когда-то сказал ЮЗ (зло причем, я после этого его очень зауважал) - я в школу ходил и азбуку читал.


 
NailMan ©   (2004-09-06 15:58) [106]

Вот вы мне скажите, сильно ли отличается VC от EMVC?

Хочется мне попрограмировать под свой PocketPC(WM2003) и что в качестве учебника нужно?  

ЗЫ: программу хочу с Delphi перевести на покет.

---
WBR, NailMan aka 2:5020/3337.13


 
Игорь Шевченко ©   (2004-09-06 16:05) [107]

Ермак ©   (06.09.04 15:41) [99]


> Да и без макроподстановок в Дельфи как без рук.


Эт еще нафига ?

Суслик ©   (06.09.04 15:29) [95]


> Иногда надо, иногда не надо вызывать _release?
>
> Такое часто возникает при подмесе модели интерфесов с моделью
> объектов. Почти все авторы, кто упоминает интерфейсы в дельфи
> не рекоммендуют так делать. Но все же приходится. Особенно,
> когда интерфейсы начинают использовать не в начале проекта,
> а потом.


То есть, компилятор должен исправлять кривые руки ? Не проще ли выпрямить их ?


> Думаю за пример сойдет.


Нет, не сойдет. Потому что это и не пример вовсе.


 
Anatoly Podgoretsky ©   (2004-09-06 16:08) [108]

Ермак ©   (06.09.04 15:41) [99]
Какой ты сговорчивый :-)


 
Суслик ©   (2004-09-06 16:11) [109]


> Игорь Шевченко ©   (06.09.04 16:05) [107]


> Нет, не сойдет. Потому что это и не пример вовсе.

Игорь, но это ты так думаешь.

------------------
Твоя любмая притча о кривых руках мне (и всем) хорошо известа.
А также то, что ты идеалист. Во многом возможность идеализма является следствием условий работы. Такой подход не у всех возможен. К сожалению.
------------------

Пример все же жизненный и вполне конкретный. Если ты этого не видишь, то опять же могу списать это на твой идеализм.


 
Игорь Шевченко ©   (2004-09-06 16:15) [110]

Суслик ©   (06.09.04 16:11) [109]

Привести пример, который будет более понятен оппоненту никак не получится ?


 
Суслик ©   (2004-09-06 16:22) [111]


> Игорь Шевченко ©   (06.09.04 16:15) [110]

получится:)

1) Вначале был большой проект. Он рос, рос и дорос до того, что стало понятно, что даже в рамках одного проекта надо вводить согическое деление, причем более строгое (т.е. с меньшим количество связей), чем просто public секция объектов.
2) Для этой цели были выбраны интерфесы.
3) Использование инетфейсов было оправдано еще тем, что для визуализации четырех разных конструкций использовался один и тоже набор компонент (гриды, едиты и т.д.).
4) В момент ввода интерфейсов не все конструкции были доделаны.
5) В итоге 2 из четырех мешают объекты и интерфейсы, а 2 сделаны чисто на интерфейсах.
6) Мешание объектов и интерфейсов приводит к тому, что иногда объект создается как объект, потом через as преобразуется к интерфейсу и передается в виз. компонент. Иногда объект сразу созадется как интерфейс. В первом случае подсчет не нужен, во втором нужен. Приходится извращаться, чего легко было бы избежать отменой по месту вызова _release.
7) В настоящее время ведется неспешная работа по отказу подмеса моделей. Когда сделаю, у меня к этой фичи претензий не будет.


 
Dok_3D ©   (2004-09-06 16:22) [112]

Истина где-то рядом. Скоро мы узнаем, у кого толще.


 
Игорь Шевченко ©   (2004-09-06 16:24) [113]


> 7) В настоящее время ведется неспешная работа по отказу
> подмеса моделей. Когда сделаю, у меня к этой фичи претензий
> не будет.


Значит, таки руки, а не свойства объектной модели Object Pascal...


 
Суслик ©   (2004-09-06 16:27) [114]


> Игорь Шевченко ©   (06.09.04 16:24) [113]

я наверное психолог :)))
когда пунт 7 писал гадал через минуту или две Игорь напомнит про руки :))))

Поясняю: данный пунт я привел не для того, чтобы так вот просто выдать свои кривые руки, а для того, чтобы констатировать факт - когда мне ПРИДЕТСЯ отказаться от одной методики (никем, как я сейчас посмотрел, официлально не запрещенной) в пользу другой, язык станет лучше удовлетворять моим потребностям. Но не есть ли это свидетельство некой негибкости?


 
Игорь Шевченко ©   (2004-09-06 16:32) [115]

Суслик ©   (06.09.04 16:27) [114]

А с самого начала писать проект так, чтобы не наступать на грабли, не проще ли ? И в компиляторе ничего менять не надо...

Обычно, о нехватке каких-то средств пишут в borland"овских конференциях, если они действительно требуются. И приводят примеры, как бы требцемые средства помогли решить те или иные проблемы.


 
Суслик ©   (2004-09-06 16:36) [116]


> Игорь Шевченко ©   (06.09.04 16:32) [115]


> А с самого начала писать проект так

Если бы у меня было очень много денег, то я обязательно бы попросил тебя провести проектирование (на полном серьезе). Тогда уверен мы бы не наступили на грабли.

Зачем мне писать на Борланд? Легче другой язык выбрать, предаврительно, его конечно просмотрев на решение старых задач и на минимальное количество новых глюков:)


 
Игорь Шевченко ©   (2004-09-06 16:43) [117]

Суслик ©   (06.09.04 16:36) [116]


> Легче другой язык выбрать


Так там свои проблемы возникнут...


 
Григорьев Антон ©   (2004-09-06 16:51) [118]

Кстати, этот спор - хорошая иллюстрация к идеям Вирта. Он всю жизнь создавал языки, которые вынуждают сначала как можно лучше продумать проект, а потом уж садиться за клавиатуру. И его последний язык, Оберон, в этом отношении ещё требовательнее к качеству проектирования, чем Паскаль, и уж тем более, чем Delphi. А C/C++ создавался с целью наискорейшей реализации всего, что в голову приходит. Получаем закономерный результат: те, кто любит думать в процессе и переделывать проекты, предпочитают C/C++, а те, кто любит заранее всё продумывать - языки линии Паскаля.


 
Игорь Шевченко ©   (2004-09-06 16:52) [119]


> А C/C++ создавался с целью наискорейшей реализации всего,
> что в голову приходит.


А с этого места подробнее...


 
noname_   (2004-09-06 17:06) [120]

2 Romkin [102]

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


program testintf;
{$APPTYPE CONSOLE}

uses
 SysUtils;

type
 ITest = interface(IUnknown)
   procedure Delete;
 end;

 TTest = class(TInterfacedObject, ITest)
 private

 protected
   function _AddRef: Integer; stdcall;
   function _Release: Integer; stdcall;
 public
   procedure Delete;
 end;

var
 gTest: ITest;

procedure TTest.Delete;
begin
 Free;
end;

function TTest._AddRef: Integer;
begin
 Result := -1;
end;

function TTest._Release: Integer;
begin
 Result := -1;
end;

procedure NewObj;
begin
 gTest := TTest.Create;
end;

function GetObj: ITest;
begin
 Result := gTest;
end;

procedure DoTest;
var
 i: Integer;
 s1: string;
begin
 NewObj;
 GetObj.Delete;
 for i := 1 to 500 do
   s1 := StringOfChar(#0, 200000);
end;

begin
 try
   DoTest;
   WriteLn("all right");
 except
   on E: Exception do
     WriteLn(E.Message)
   else
     WriteLn("unknown exception");
 end;
end.



Страницы: 1 2 3 4 5 6 7 8 9 
10 11 12 13 14 15 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.71 MB
Время: 0.073 c
1-1095663259
TahirProc
2004-09-20 10:54
2004.10.03
Ошибка при закрытии программы


1-1095609224
Елис
2004-09-19 19:53
2004.10.03
StrinGrid


1-1095231222
roma
2004-09-15 10:53
2004.10.03
peremenniy


14-1095342975
Константинов
2004-09-16 17:56
2004.10.03
Сроду не догадаетесь!!!


3-1094138777
matt
2004-09-02 19:26
2004.10.03
DBComboBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский